Fehler, Irrtümer, Fragen - Seite 1891

 
Renat Fatkhullin:

Ja, sicher.

Sind Sie sicher? Denn dynamic_cast wird am häufigsten für die Bottom-up-Konvertierung verwendet, also vom Elternteil zum Nachkommen.

Außerdem gießt er bei MMS perfekt von unten nach oben, auch wenn er das nicht sollte:

class A
{
public:
   virtual void f()
   {
      Print("1");
   }
};

class B: public A
{
public:
   virtual void f()
   {
      Print("2");
   }
};

void OnStart()
{
   A* ptr1 = new B();
   ptr1.f();
   A* ptr2 = new A();
   ptr2.f();
   
   B* casted = dynamic_cast<B*>(ptr1);
   casted.f();
   
   B* casted1 = dynamic_cast<B*>(ptr2);
   casted1.f(); // здесь должна быть ошибка потому что casted1 должен быть null
   delete ptr1;
   delete ptr2;
}

вывод:
2017.05.13 18:30:14.864    t ETHUSD,M5: 2
2017.05.13 18:30:14.865    t ETHUSD,M5: 1
2017.05.13 18:30:14.866    t ETHUSD,M5: 2
2017.05.13 18:30:14.867    t ETHUSD,M5: 2


Renat Fatkhullin:

Werfen Sie einen Blick auf das besprochene MQL5-Codefragment.

Ja, es sollte nicht funktionieren, und das wurde bereits oben erklärt, aber nicht, weil ein Bottom-up-Cast unmöglich ist.

 
Konstantin:
Wenn wir den Zeiger von oben nach unten, d.h. auf den Elternteil, werfen und dann den Zeiger an eine andere Stelle im Geltungsbereich weitergeben, sind dann die Felder des Nachkommens dort verfügbar?

Ja, hier ist ein Beispiel, das Ihre Frage veranschaulicht:

class CLASS1
  {
public:
   int               i;
  };
class CLASS2 : public CLASS1
  {
  };
void OnStart()
  {
   CLASS1 _object;
   CLASS2 *_ptr=dynamic_cast<CLASS2 *>(&_object);

   if(!_ptr)
      Print("CLASS1 -> CLASS2 failed, null");

   CLASS2 *my=new CLASS2;
   CLASS1 *my_ptr=my;
   CLASS2 *my_ptr2=dynamic_cast<CLASS2 *>(my_ptr);

   if(my_ptr2)
     {
      Print("CLASS2 -> CLASS1 -> CLASS2 ok");
      my_ptr2.i=1;
     }
   Print("Value: ",my.i);
  }
und Ausgabe:
2017.05.13 18:34:50.341 cast (EURUSD,H1)        CLASS1 -> CLASS2 failed, null
2017.05.13 18:35:18.933 cast (EURUSD,H1)        CLASS2 -> CLASS1 -> CLASS2 ok
2017.05.13 18:35:20.110 cast (EURUSD,H1)        Value: 1

Zuerst prüfen wir den ungelösten Wurf von unten nach oben und erhalten NULL. Das ist richtig.

Dann erstellen wir ein CLASS2-Objekt und weisen seiner Elternklasse eine Referenz darauf zu (hier ist es wichtig zu verstehen, dass die Umgebung dynamisch weiß, dass der ursprüngliche Typ des CLASS2-Objekts in seinen Metainformationen gespeichert ist). Dann (nur Ihre Frage) dynamisch Cast (mit Konvertierung Recht Prüfung auf der Grundlage der Quelle Objekts Metainformationen) von Referenz CLASS1 zu CLASS2.

Wir überprüfen das Ergebnis des Castings und schreiben es in die Variable i = 1. Schließlich geben wir den Wert von i aus und verweisen auf das ursprünglich erstellte Objekt.

Alles funktioniert korrekt und gemäß der Spezifikation (einschließlich der dynamic_cast-Spezifikation von C++ selbst).

 
Комбинатор:

Sind Sie sicher? Denn dynamic_cast wird am häufigsten für die Bottom-up-Konvertierung verwendet, also vom Elternteil zum Nachkommen.

Außerdem gießt er bei MMS perfekt von unten nach oben, auch wenn er das nicht sollte:

Ganz genau:

Vergessen Sie nicht, auf die neuesten Builds zu aktualisieren. Ich teste derzeit mit der Version 1598, die kürzlich als gezippte Version in diesem Thread veröffentlicht wurde.

 
Renat Fatkhullin:

Vergessen Sie nicht, auf die neuesten Builds zu aktualisieren.

Ja, die alte Version.

Renat Fatkhullin:

Das stimmt, man kann nicht von unten nach oben fahren, sondern nur von oben nach unten. Dies geschieht aus Gründen der Sicherheit.

Sie sollten dies löschen, es ist irreführend und steht im direkten Widerspruch zur Funktion von dynamic_cast
 
Комбинатор:

Ja, die alte Version.

Dies ist irreführend und widerspricht direkt der Funktionsweise von dynamic_cast

Im Rahmen des angesprochenen Kopf-an-Kopf-Casting-Beispiels KLASSE 1 -> KLASSE 2 haben Sie es richtig gemacht. Das ist die Art von Casting, die die meisten Leute in ihrem Kopf haben.

Auch ist es die "Sie können nicht von unten nach oben werfen, nur von oben nach unten", dass der Kern der dynamic_cast Sicherheitsprüfung ist.

Diejenigen, die wissen, was sie tun, verstehen das Wesentliche von dynamic_cast.

 
Renat Fatkhullin:

Vergessen Sie nicht, auf die neuesten Builds zu aktualisieren. Ich teste derzeit die Version 1598, die vor kurzem als Zip-Datei in diesem Thread gepostet wurde, glaube ich.

In welcher Exe-Datei befinden sich der Compiler und der Executor?

Im Moment läuft MT4b1080 mit MEb1599. Bitte erklären Sie, was metaeditor.exe und terminal.exe tun.

 
fxsaber:

In welcher Exe-Datei befinden sich der Compiler und der Executor?

Auf dem MT4b1080 läuft jetzt MEb1599. Bitte erklären Sie, was metaeditor.exe und terminal.exe tun.

Der Compiler ist für beide Plattformen derselbe. Sie befindet sich in metaeditor.exe
 
Renat Fatkhullin:
Der Compiler für beide Plattformen ist derselbe. Sie befindet sich in metaeditor.exe
Und der Executor, der denselben dynamic_cast prüft, in terminal.exe?
 
fxsaber:
Und der Executor, der denselben dynamic_cast überprüft, in terminal.exe?
Natürlich
 
Renat Fatkhullin:
Eine weitere Frage wie diese

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Wanzen, Wanzen, Fragen

fxsaber, 2017.05.11 13:26

Warum EX5 ein solcher Code
void OnStart() {}

Wiegt es 5kb?