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

 
Vladimir Simakov #:

Что бы не тащить имена внутренних типов в пространство имен. В больших проектах банально удобнее TClassA::TSet и TClassB::TSet, чем TSetClassA и TSetClassB.

Ааа, я понял: это имеет смысл при использовании 

namespace

Я просто не использовал еще пространства имен (их объявление). Спасибо большое!

Vladimir Simakov #:

Что бы их не было видно за пределами класса, объявляй их private

Для этого тоже пространство имен нужно наверное. По тому, что вот так вот можно:

class CTest
  {
private:
   struct STRUCT_TEST
     {
      int a;
      int b;
     }member;
public:
  };

void OnStart()
  {
   STRUCT_TEST outOfClass;
  }
 
Vladislav Boyko #:

Ааа, я понял: это имеет смысл при использовании 

Я просто не использовал еще пространства имен (их объявление). Спасибо большое!

Для этого тоже пространство имен нужно наверное. По тому, что вот так вот можно:

Есть еще такое понятие как глобальное пространство имен)

 
Vladimir Simakov #:

Есть еще такое понятие как глобальное пространство имен)

Ну глобальное то все невольно используют)

Я, к слову, на текущем этапе (освоения ООП) использую оператор расширения контекста что бы явно обозначить вызов функции, которая объявлена в глобальной области и не является методом класса:

class CTest
  {
private:
   
public:
   void someMethod(datetime dt)
     {
      //...
      MqlDateTime inStruct;
      if(!::timeToStruct(dt, inStruct))
         return;
      //...
     }
  };

bool timeToStruct(datetime time, MqlDateTime &var)
  {
   ResetLastError();
   if(TimeToStruct(time, var))
      return(true);
   PrintFormat("TimeToStruct error %i, time %s", GetLastError(), TimeToString(time));
   return(false);
  }

Ну а имена функций MQL для нейминга своих методов (как здесь) не использую в принципе: как минимум, подсвечивание сбивает с толку

 

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

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() ?

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