Errori, bug, domande - pagina 1889

 

È un bug o mi sfugge qualcosa? Un normale EA parabolico piazza un ordine stop al punto precedente, in caso di acquisto con lo spread preso in considerazione.
E ora il prezzo (Ask) ha raggiunto il prezzo dell'ordine 57781, ma l'ordine non è aperto.

 
Qual è l'errore di eseguire
class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast<CLASS2*>(&Object);
  
  Ptr.i = 1;
}
 
fxsaber:
Qual è l'errore di runtime

se fai questo:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

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

cioè la conversione in genitore, allora tutto va correttamente, apparentemente sono avvenuti cambiamenti molto significativi nella struttura del linguaggio e ora il tipo derivato non è inequivocabilmente un tipo antenato.

Controllato su C++:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

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

La preconversione di un oggetto di una classe madre in una derivata è gestita correttamente, cioè c'è un errore nel meccanismo di MQL5 con la conversione dei tipi, a meno che non sia stato progettato in quel modo.

 
fxsaber:
Qual è l'errore di esecuzione

Se non controllate cosa restituisce dynamic_cast, non ha senso usarlo.

 
Konstantin:

se fai questo:

cioè la conversione in genitore, allora tutto va correttamente, apparentemente un cambiamento molto significativo nella struttura del linguaggio ha avuto luogo e ora il tipo derivato non è inequivocabilmente un tipo antenato.

Il casting parentale ha sempre funzionato in MQL senza dynamic_cast - classicamente. Forse non capisco il significato di dynamic_cast. Forse non capisco il significato dell'esempio nella documentazione. Qualcuno potrebbe spiegare.
 
Koldun Zloy:

Se non controllate cosa restituisce dynamic_cast, non ha senso usarlo.

Grazie, nel mio esempio restituisce NULL. Perché succede questo?

Potresti fare un esempio pratico di come usare questo trucco?


Gli sviluppatori lo usano solo in Graphic.mqh come segue

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

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

Allo stesso tempo hanno definizioni di classi/oggetti come questa

class CCurve : public CObject

CObject          *At(const int index) const;

Cioè, passano un puntatore genitore a un figlio. Beh, è esattamente quello che faccio nel mio esempio! Dov'è l'intoppo?

 

Un puntatore a una classe padre può effettivamente contenere un puntatore a un discendente.

class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

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

// b != NULL
 
Koldun Zloy:

Un puntatore a una classe padre può effettivamente contenere un puntatore a un discendente.

Grazie, ho capito!
 
fxsaber:
Grazie, ho capito!

Ancora non capisco perché in MQL non si può lanciare un puntatore a un tipo di puntatore di classe discendente, ma in C++ è possibile, potete spiegare se è un bug in MQL o dovrebbe essere così?

 
Konstantin:

è possibile in C++, puoi spiegare se è un bug in MQL o dovrebbe esserlo?

In C++ è anche possibile solo se un puntatore a una classe base punta a un discendente.