Ошибки, баги, вопросы - страница 3305

 

Это я что-то не понимаю, или тут действительно что-то не так?

class A
  {
public:
         A(const int a=0);
        ~A(void){};
   int   a1;
  };

A::A(int a)
  {
   a1=a;
   Print("A a1=",a1);
  }

class B : A
  {
public:
         B(const int b=1);
        ~B(void){};
   int   B_Test(void);
  };

B::B(int b)
  {
   A(b);
  }

int  B::B_Test(void)
  {
   return a1;
  }

B  test();

void OnStart()
  {
   Print("a1=",test.B_Test());
  }

Результат:

2023.03.25 13:14:12.969 test (Si-6.23,M15)      A a1=0
2023.03.25 13:14:12.970 test (Si-6.23,M15)      A a1=1
2023.03.25 13:14:12.970 test (Si-6.23,M15)      a1=0

Конструктор с параметрами по умолчанию используется как конструктор по умолчанию (первый вызов A::A(int)), хотя в документации сказано, что это не так:

"Конструктор, все параметры которого имеют значения по умолчанию, не является конструктором по умолчанию.https://www.mql5.com/ru/docs/basis/types/classes#default_constructor

Второй вызов A::A(int) (из B::B(int) ) устанавливает значение a1, которое после "исчезает".

 
JRandomTrader #:

Это я что-то не понимаю, или тут действительно что-то не так?

Результат:

Конструктор с параметрами по умолчанию используется как конструктор по умолчанию (первый вызов A::A(int)), хотя в документации сказано, что это не так:

"Конструктор, все параметры которого имеют значения по умолчанию, не является конструктором по умолчанию.https://www.mql5.com/ru/docs/basis/types/classes#default_constructor

Второй вызов A::A(int) (из B::B(int) ) устанавливает значение a1, которое после "исчезает".

Тут, конечно, грабли от разработчиков MQL.

Поправляются таким образом:
B::B(int b) : A(b)
  {
  }

Почему из конструктора нельзя нормально вызвать другой конструктор - 🤷🏻‍♂️
 
Sergey Gridnev #:
Тут, конечно, грабли от разработчиков MQL.

Поправляются таким образом:
B::B(int b) : A(b)
  {
  }

Почему из конструктора нельзя нормально вызвать другой конструктор - 🤷🏻‍♂️

Спасибо.

А если другие параметры вызова A() зависят от вычислений внутри B::B() ?

 

Я дико извиняюсь, а что за хреновина с версией 3660 (судя по названию файла)? Никогда такого не было...

 
Dmitriy Skub #:

Я дико извиняюсь, а что за хреновина с версией 3660 (судя по названию файла)? Никогда такого не было...

Антивирус добрался до агентов?

 
JRandomTrader #:

Спасибо.

А если другие параметры вызова A() зависят от вычислений внутри B::B() ?

Тогда, похоже, никак.
Но в Java тоже вызов конструктора суперкласса возможен только первой командой в конструкторе потомка, так что ситуация аналогична - нельзя в потомке произвести вычисление параметров конструктора родительского класса.
 
JRandomTrader #:

А если другие параметры вызова A() зависят от вычислений внутри B::B() ?

Конструкторы вызываются строго снизу-вверх: от родителя к потомкам.

 
Sergey Gridnev #:
Тогда, похоже, никак.
Но в тоже Java вызов конструктора суперкласса возможен только первой командой в конструкторе потомка, так что ситуация аналогична - нельзя в потомке произвести вычисление параметров конструктора родительского класса.

Т.е., для родительских классов, если мы не планируем создавать их объекты, фактически имеет смысл только конструктор по умолчанию (или выполняющий, вопреки документации, его роль конструктор со всеми параметрами по умолчанию)?

 
JRandomTrader #:

Т.е., для родительских классов, если мы не планируем создавать их объекты, фактически имеет смысл только конструктор по умолчанию (или выполняющий, вопреки документации, его роль конструктор со всеми параметрами по умолчанию)?

На случай, если в потомке надо определять параметры для инициализации родителя, я бы делал метод инициализации в родительском классе, объявив его как protected.
 
Sergey Gridnev #:
На случай, если в потомке надо определять параметры для инициализации родителя, я бы делал метод инициализации в родительском классе, объявив его как protected.

Собственно, так и делал.

Но, думается, на такой вызов конструктора, как у меня выше, компилятор должен выдавать ошибку или хотя бы предупреждение о бесполезности кода, а не делать вид, что всё хорошо, тем самым внося трудноуловимые ошибки.

Причина обращения: