Erros, bugs, perguntas - página 1889

 

Isto é um insecto ou falta-me alguma coisa? Uma EA parabólica normal coloca uma ordem de paragem no ponto anterior, no caso de compra com o spread tomado em consideração.
E agora o preço (Pergunte) atingiu o preço de encomenda 57781, mas a encomenda não está aberta.

 
Qual é o erro de executar
class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast<CLASS2*>(&Object);
  
  Ptr.i = 1;
}
 
fxsaber:
Qual é o erro de tempo de execução

se o fizer:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

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

ou seja, conversão para pai, depois tudo corre bem, aparentemente ocorreram mudanças muito significativas na estrutura da língua e agora o tipo derivado não é, sem ambiguidade, um tipo ancestral.

Verificado em C++:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

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

A pré-conversão de um objecto de classe mãe para um objecto derivado é tratada correctamente, ou seja, há um erro no mecanismo MQL5 com conversão de tipo, a menos que não tenha sido concebido dessa forma.

 
fxsaber:
Qual é o erro de execução

Se não verificar o que o dynamic_cast retorna, não vale a pena utilizá-lo.

 
Konstantin:

se o fizer:

ou seja, conversão para pai, depois tudo corre bem, aparentemente ocorreu uma mudança muito significativa na estrutura da língua e agora o tipo derivado não é, sem ambiguidade, um tipo ancestral.

A fundição dos pais sempre funcionou em MQL sem transmissão_dinâmica - classicamente. Talvez eu não compreenda o significado de dynamic_cast. Talvez eu não compreenda o significado do exemplo na documentação. Alguém poderia explicar.
 
Koldun Zloy:

Se não verificar o que o dynamic_cast retorna, não vale a pena utilizá-lo.

Obrigado, no meu exemplo devolve NULL. Porque é que isto acontece?

Poderia dar um exemplo prático de como utilizar este truque?


Os programadores usam-no apenas em Graphic.mqh como se segue

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

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

Ao mesmo tempo, têm definições de classes/objectos como esta

class CCurve : public CObject

CObject          *At(const int index) const;

Ou seja, eles passam um ponteiro dos pais a uma criança. Bem, é exactamente isso que eu faço no meu exemplo! Onde está o problema?

 

Um ponteiro para uma classe de pais pode realmente conter um ponteiro para um descendente.

class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

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

// b != NULL
 
Koldun Zloy:

Um ponteiro para uma classe de pais pode realmente conter um ponteiro para um descendente.

Obrigado, já está!
 
fxsaber:
Obrigado, consegui-o!

Ainda não percebo porque é que no MQL não se pode lançar um ponteiro para um tipo de ponteiro de classe descendente, mas em C++ é possível, pode explicar se é um erro no MQL ou se deve ser assim?

 
Konstantin:

é possível em C++, pode explicar se é um bug em MQL ou deveria ser?

Em C++ também só é possível se um ponteiro para uma classe base apontar para um descendente.