Равзе конструктор возвращает 'успешность' исполнения?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Viktar Dzemikhau
3386
Viktar Dzemikhau  

Вчера мне попался такой вот, странный на первый взгляд, вариант реализации одной задачи. Напишу проще.

class CustomClass {
  CustomClass(string filename, int flags, string vfs = "") {
    // Тело конструктора
  }
 ~CustomClass() {
    // Тело деструктора
  }
}

Дальше начинается самое интересное. В OnStart() вижу такое:

  CustomClass db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
  if (!db.isValid())
    return;

Это как понимать? Если понадобится кину полный код. Но я упростил.

Получается, по синтаксису типа объявляется экземпляр класса CustomClass. А на деле, я в шоке от таких кодов. Как можно было вообще догадаться до такого, что бы такое написать..)) Жесть какая-то. Очень хочется услышать что это за хрень и откуда её корни вообще идут. Я не встречал на чём писал подобного.

Konstantin Nikitin
9210
Konstantin Nikitin  
Viktar Dzemikhau:

Вчера мне попался такой вот, странный на первый взгляд, вариант реализации одной задачи. Напишу проще.

Дальше начинается самое интересное. В OnStart() вижу такое:

Это как понимать? Если понадобится кину полный код. Но я упростил.

Получается, по синтаксису типа объявляется экземпляр класса CustomClass. А на деле, я в шоке от таких кодов. Как можно было вообще догадаться до такого, что бы такое написать..)) Жесть какая-то. Очень хочется услышать что это за хрень и откуда её корни вообще идут. Я не встречал на чём писал подобного.

А от конструктора возвращения чего-то и не ожидается как видно. В него передаются параметры и все.

  CustomClass db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);

Ожидание уже идет от функции класса isValid

  if (!db.isValid())
    return;
Koldun Zloy
761
Koldun Zloy  
Viktar Dzemikhau:

Вчера мне попался такой вот, странный на первый взгляд, вариант реализации одной задачи. Напишу проще.

Дальше начинается самое интересное. В OnStart() вижу такое:

Это как понимать? Если понадобится кину полный код. Но я упростил.

Получается, по синтаксису типа объявляется экземпляр класса CustomClass. А на деле, я в шоке от таких кодов. Как можно было вообще догадаться до такого, что бы такое написать..)) Жесть какая-то. Очень хочется услышать что это за хрень и откуда её корни вообще идут. Я не встречал на чём писал подобного.

И в чём тут жесть?

То что Вы этого не встречали, не удивительно.

Судя по Вашим вопросам, Вы ещё многого не встречали.


Viktar Dzemikhau
3386
Viktar Dzemikhau  
Konstantin Nikitin:

Ожидание уже идет от функции класса isValid

Я это вижу. Вот оригинальный код:

class SQLite3 {
  private:
    // Объявления private-переменных и методов
  public:
    // Объявления public-переменных и методов
    
    SQLite3(string filename, int flags, string vfs = "") {
      m_valid = sqlite3_open(filename, m_ref, flags, vfs);
      if (m_valid != SQLITE_OK)
        Print(">>> Error opening database [", filename, "]: ", SQLite3 :: errorCode2Msg(m_valid));
    }
   ~SQLite3() {
      if(isValid()) {
        int ret = sqlite3_close(m_ref);
        if (ret != SQLITE_OK)
          Print(">>> Error close connection: ", getErrorMsg());
      }
    }
    bool   isValid() const {return m_valid == SQLITE_OK;}
}

Вот вызов из OnStart():

void OnStart() {
  SQLite3 db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
  if (!db.isValid())
    return;
}

Так вот даже здесь видно, что метод db(...) это и есть конструктор класса SQLite3. Я вот и думаю, а как автор умудрился обозвать этот конструкторе как db?

Viktar Dzemikhau
3386
Viktar Dzemikhau  
Koldun Zloy:

И в чём тут жесть?

То что Вы этого не встречали, не удивительно.

Судя по Вашим вопросам, Вы ещё многого не встречали.

Выше написал вопрос. Не очевидно вызывать функцию db, которой нет вообще т.е. она даже не объявлена. В то же время, это вообще конструктор, а не функция. Вот это странно. Если для Вас это не странно, попробуйте пояснить.. Думаю, интересно не только мне. Не банальный вопрос..

Koldun Zloy
761
Koldun Zloy  
Viktar Dzemikhau:

Выше написал вопрос. Не очевидно вызывать функцию db, которой нет вообще т.е. она даже не объявлена. В то же время, это вообще конструктор, а не функция. Вот это странно. Если для Вас это не странно, попробуйте пояснить.. Думаю, интересно не только мне. Не банальный вопрос..

db это имя объекта. Если не нравится можете обозвать его: 'x'.

В строке

SQLite3 db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);

создаётся объект db.

Встроке

if( !db.isValid() )

вызывается функция этого объекта.

Это всё элементарные вещи.

Konstantin Nikitin
9210
Konstantin Nikitin  
Viktar Dzemikhau:

Выше написал вопрос. Не очевидно вызывать функцию db, которой нет вообще т.е. она даже не объявлена. В то же время, это вообще конструктор, а не функция. Вот это странно. Если для Вас это не странно, попробуйте пояснить.. Думаю, интересно не только мне. Не банальный вопрос..

А это что???

class SQLite3 {
  private:
    // Объявления private-переменных и методов
  public:
    // Объявления public-переменных и методов
    
    SQLite3(string filename, int flags, string vfs = "") {
      m_valid = sqlite3_open(filename, m_ref, flags, vfs);
      if (m_valid != SQLITE_OK)
        Print(">>> Error opening database [", filename, "]: ", SQLite3 :: errorCode2Msg(m_valid));
    }
   ~SQLite3() {
      if(isValid()) {
        int ret = sqlite3_close(m_ref);
        if (ret != SQLITE_OK)
          Print(">>> Error close connection: ", getErrorMsg());
      }
    }
    bool   isValid() const {return m_valid == SQLITE_OK;}
}

Разве не функция класса???

Viktar Dzemikhau
3386
Viktar Dzemikhau  
Konstantin Nikitin:

А это что???

Разве не функция класса???

А это функция класса SQLite3. Но я то приводил не только эту строку:

void OnStart() {
  SQLite3 db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);
  if (!db.isValid())
    return;
}

В строках:

if (!db.isValid())
    return;

Уже, по сути, всё очевидно. А строка:

SQLite3 db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);

Странная.

Viktar Dzemikhau
3386
Viktar Dzemikhau  
Koldun Zloy:

db это имя объекта. Если не нравится можете обозвать его: 'x'.

В строке

SQLite3 db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);

создаётся объект db.

Встроке

if( !db.isValid() )

вызывается функция этого объекта.

Это всё элементарные вещи.

Объект т.е. экземпляр класса создаётся через оператор new. А если методы класса статичные, то экземпляр не нужен. Можно вызвать было бы типа как здесь SQLite.вызываемый метод.

А мы видим, что здесь он типа создаёт объект, что, кстати, я уже и написал выше т.к. понял что это так. Но это не верно синтаксически. Вот как было бы, правильно:

SQLite3 sql = new SQLite3(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);

Вот здесь очевидно, что это объект, как Вы выразились. А в том случает хз что за синтаксис вообще. Было бы интересно увидеть ссыоку на открытый источник или книгу, или вообще тему, как называется подобное. Т.к. сколько читал, такого не встречал.

Taras Slobodyanik
38219
Taras Slobodyanik  
Viktar Dzemikhau:

Объект т.е. экземпляр класса создаётся через оператор new. А если методы класса статичные, то экземпляр не нужен. Можно вызвать было бы типа как здесь SQLite.вызываемый метод.

А мы видим, что здесь он типа создаёт объект, что, кстати, я уже и написал выше т.к. понял что это так. Но это не верно синтаксически. Вот как было бы, правильно:

Вот здесь очевидно, что это объект, как Вы выразились. А в том случает хз что за синтаксис вообще. Было бы интересно увидеть ссыоку на открытый источник или книгу, или вообще тему, как называется подобное. Т.к. сколько читал, такого не встречал.

вот здесь почитайте Классы (после структур)

https://www.mql5.com/ru/docs/basis/types/classes

Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
Документация по MQL5: Основы языка / Типы данных / Структуры, классы и интерфейсы
  • www.mql5.com
Структура является набором элементов произвольного типа (кроме типа void). Таким образом, структура объединяет логически связанные данные разных типов. Объявление структуры Имя структуры нельзя использовать в качестве идентификатора (имени переменной или функции). Следует иметь ввиду, что в MQL5 элементы структуры следуют непосредственно друг...
Andrei Novichkov
8209
Andrei Novichkov  
Простите, но Вы что то не то читали. Вам нужен нормальный учебник типа "C++ для чайников" и проштудировать его от корки до корки. Вы только не обижайтесь, я не хочу Вас обидеть, но все Ваши вопросы удивительно примитивны.
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий