Fehler, Irrtümer, Fragen - Seite 1889

 

Ist dies ein Fehler oder übersehe ich etwas? Ein normaler parabolischer EA platziert eine Stop-Order am vorherigen Punkt, im Falle eines Kaufs unter Berücksichtigung des Spreads.
Der Kurs (Ask) hat also den Auftragspreis 57781 erreicht, aber der Auftrag wird nicht eröffnet.

 
Was ist der Fehler bei der Durchführung
class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast<CLASS2*>(&Object);
  
  Ptr.i = 1;
}
 
fxsaber:
Was ist der Laufzeitfehler?

wenn Sie dies tun:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

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

d.h. Umwandlung in einen übergeordneten Typ, dann geht alles richtig, anscheinend haben sehr bedeutende Änderungen in der Sprachstruktur stattgefunden und jetzt ist der abgeleitete Typ definitiv kein Vorfahrentyp.

Geprüft auf C++:

class CLASS1
{
public:
  int i;  
};

class CLASS2 : public CLASS1 {};

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

Das Casting eines Objekts einer Elternklasse in eine abgeleitete Klasse wird korrekt gehandhabt, d.h. es gibt einen Fehler im MQL5-Mechanismus mit Typ-Casting, es sei denn, er wurde nicht so entworfen.

 
fxsaber:
Was ist der Ausführungsfehler?

Wenn Sie nicht überprüfen, was dynamic_cast zurückgibt, ist es sinnlos, es zu verwenden.

 
Konstantin:

wenn Sie dies tun:

d.h. Umwandlung in einen übergeordneten Typ, dann geht alles richtig, anscheinend hat eine sehr bedeutende Änderung in der Sprachstruktur stattgefunden und der abgeleitete Typ ist nun eindeutig kein Vorfahrentyp.

Parental Casting hat in MQL immer ohne dynamic_cast funktioniert - ganz klassisch. Vielleicht verstehe ich die Bedeutung von dynamic_cast nicht. Ich verstehe vielleicht den Sinn des Beispiels in der Dokumentation nicht. Jemand könnte das erklären.
 
Koldun Zloy:

Wenn Sie nicht überprüfen, was dynamic_cast zurückgibt, ist es sinnlos, es zu verwenden.

Danke, in meinem Beispiel gibt es NULL zurück. Warum ist das so?

Können Sie ein praktisches Beispiel für die Anwendung dieses Tricks nennen?


Die Entwickler verwenden es nur in Graphic.mqh wie folgt

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

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

Gleichzeitig haben sie Definitionen von Klassen/Objekten wie diese

class CCurve : public CObject

CObject          *At(const int index) const;

Das heißt, sie übergeben einen Elternzeiger an ein Kind. Nun, genau das tue ich in meinem Beispiel! Wo ist der Haken an der Sache?

 

Ein Zeiger auf eine übergeordnete Klasse kann tatsächlich einen Zeiger auf einen Nachfahren enthalten.

class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

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

// b != NULL
 
Koldun Zloy:

Ein Zeiger auf eine übergeordnete Klasse kann tatsächlich einen Zeiger auf einen Nachfahren enthalten.

Danke, ich hab's!
 
fxsaber:
Danke, ich habe es verstanden!

Ich verstehe immer noch nicht, warum in MQL können Sie nicht einen Zeiger auf einen absteigenden Klasse Zeigertyp, aber in C++ ist es möglich, können Sie erklären, wenn es ein Fehler in MQL ist oder es sollte so sein?

 
Konstantin:

ist es möglich, in C++, können Sie erklären, wenn es ein Fehler in MQL ist oder sollte es sein?

In C++ ist dies auch nur möglich, wenn ein Zeiger auf eine Basisklasse auf einen Nachfahren zeigt.