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

 

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

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. А на деле, я в шоке от таких кодов. Как можно было вообще догадаться до такого, что бы такое написать..)) Жесть какая-то. Очень хочется услышать что это за хрень и откуда её корни вообще идут. Я не встречал на чём писал подобного.

 
Viktar Dzemikhau:

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

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

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

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

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

  CustomClass db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);

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

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

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

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

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

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

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

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

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


 
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?

 
Koldun Zloy:

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

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

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

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

 
Viktar Dzemikhau:

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

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

В строке

SQLite3 db(dbPath, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE);

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

Встроке

if( !db.isValid() )

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

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

 
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;}
}

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

 
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);

Странная.

 
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);

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

 
Viktar Dzemikhau:

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

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

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

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

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

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