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

 

Это баг или я чето-то не понимаю? обычный советник по параболику, ставит стоп ордер на прошлой точке, в случае с бай с учетом спреда.
И вот цена (Ask) дошла до цены ордера 57781, но ордер не открывается.

 
В чем ошибка выполнения
class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast<CLASS2*>(&Object);
  
  Ptr.i = 1;
}
 

если сделать так:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS2 Object;
  CLASS1* Ptr = dynamic_cast<CLASS1*>(&Object);
  
  Ptr.i = 1;
}

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

Проверил на С++:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1* Object = new CLASS1();
  CLASS2* Ptr = (CLASS2 *)&Object;
  
  Ptr->i = 1;
}

приведение объекта родительского класса к типу производного отрабатывается корректно, т.е. какая то ошибка в механизме MQL5 с приведением типов, если конечно так не было задумано.

 

Если Вы не проверяете, что возвращает  dynamic_cast, то его использование не имеет смысла.

 
Konstantin:

если сделать так:

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

Приведение к родителю всегда в MQL работало и без dynamic_cast - классически. Возможно, не понимаю смысл dynamic_cast. По примеру в документации, наверное, не понял смысл. Кто бы пояснил.
 
Koldun Zloy:

Если Вы не проверяете, что возвращает  dynamic_cast, то его использование не имеет смысла.

Спасибо, в моем примере NULL возвращает. Почему так происходит?

Могли бы Вы привести практичный пример использования данной фишки?


Разработчики используют ее только в Graphic.mqh следующим образом

      curve=dynamic_cast<CCurve*>(m_arr_curves.At(i));

      if(CheckPointer(curve)!=POINTER_DYNAMIC)
         return(false);

При этом у них такие определения классов/объектов

class CCurve : public CObject

CObject          *At(const int index) const;

Т.е. они приводят родительский указатель к потомку. Ну так и в своем примере ровно это и делаю! Где загвоздка?

 

Указатель на родительский класс фактически может содержать указатель на потомка.

class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

Class2* b = dynamic_cast< Class2* >( a );

// b != NULL
 
Koldun Zloy:

Указатель на родительский класс фактически может содержать указатель на потомка.

Спасибо, въехал!
 
fxsaber:
Спасибо, въехал!

а я так и не понял, почему в MQL невозможно приведение указателя к типу указателя класса наследника, а в С++ это возможно, разъясните плз это баг в MQL или так и должно быть?

 
Konstantin:

в С++ это возможно, разъясните плз это баг в MQL или так и должно быть?

в С++ это тоже возможно только если указатель на базовый класс указывает на потомка.
Причина обращения: