Ich verstehe immer noch nicht, über Zeiger und Referenzen in MQL5 und jetzt in MQL4. Was ist der Unterschied zwischen der Übergabe von Referenzen und Zeigern, außer dem zusätzlichen Code? In C++ gibt es einen Unterschied, aber was ist er hier? Wenn es nicht schwierig ist, mehr Details zu schreiben.
Die Übergabe per Referenz erfordert, dass das Objekt, das per Referenz übergeben wird, initialisiert wird. Bei der Übergabe per Zeiger gibt es diese Einschränkung nicht:
Wenn die Funktion TestShapeRef aufgerufen wird, stürzt der Code ab, weil die Form nicht initialisiert ist. In der Funktion TestShapePointer hingegen ist eine ständige Überprüfung erforderlich, ob das übergebene Objekt initialisiert ist oder nicht. Befolgen Sie daher die imprirische Regel:
Wenn gewährleistet sein muss, dass das Objekt zum Zeitpunkt der Übergabe an die Funktion existiert, verwenden Sie einen "&"-Übertrag. Wenn die Funktion ein Objekt benötigt, dessen Zustand undefiniert ist - verwenden Sie die Übergabe mit einem "*"-Zeiger, und überprüfen Sie innerhalb dieser Funktion die Gültigkeit des übergebenen Zeigers.
Es gibt noch eine weitere Nuance, die Sie im Auge behalten sollten. Betrachten Sie das vorherige Beispiel:
Wird dieses Programm korrekt funktionieren? Nein, es wird mit der Fehlermeldung "invalid pointer access" in der Zeile printf(shape.name); //ERROR (!?) enden, obwohl wir scheinbar garantiert ein Objekt in der Funktion TestShapePointer erzeugen. Der Punkt ist, dass tatsächlich eine NULL-Referenz anstelle von shape übergeben wurde. Das heißt, die Form innerhalb der Funktion und die übergebene Form sind unterschiedliche Objekte! Daher ist nach dem Verlassen der Funktion shape immer noch gleich NULL, und der shape-Zeiger innerhalb der Funktion ist verloren (auf dem Stack gelöscht). Also.
tol64: Nein. Das ist das erste Mal, dass ich davon höre. Wo kann ich darüber lesen?
Es ist ein gängiges Adjektiv, hier ist ein Beispiel:
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+class CFoo
{
};
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+class CBar : public CFoo
{
public:
void func(int x) { Print("Hello from Bar ",x); }
};
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+void func(CFoo *foo)
{
//--- Aufruf mit Casting direkt vom Zeiger zum Basistyp
((CBar*)foo).func(1);
//--- Aufruf mit Konvertierung in den Zieltyp und Speichern einer Kopie des Zeigers mit dem gewünschten Typ
CBar *b=(CBar *)foo;
b.func(2);
//--- die dynamisch erstellte Klasse löschendelete foo;
}
//+------------------------------------------------------------------+//||//+------------------------------------------------------------------+voidOnStart()
{
func(new CBar);
}
//+------------------------------------------------------------------+
Ich verstehe immer noch nicht, über Zeiger und Referenzen in MQL5 und jetzt in MQL4. Was ist der Unterschied zwischen der Übergabe von Referenzen und Zeigern, außer dem zusätzlichen Code? In C++ gibt es einen Unterschied, aber was ist er hier? Wenn es nicht schwierig ist, mehr Details zu schreiben.
Die Übergabe per Referenz erfordert, dass das Objekt, das per Referenz übergeben wird, initialisiert wird. Bei der Übergabe per Zeiger gibt es diese Einschränkung nicht:
Wenn die Funktion TestShapeRef aufgerufen wird, stürzt der Code ab, weil die Form nicht initialisiert ist. In der Funktion TestShapePointer hingegen ist eine ständige Überprüfung erforderlich, ob das übergebene Objekt initialisiert ist oder nicht. Befolgen Sie daher die imprirische Regel:
Es gibt noch eine weitere Nuance, die Sie im Auge behalten sollten. Betrachten Sie das vorherige Beispiel:
Wird dieses Programm korrekt funktionieren? Nein, es wird mit der Fehlermeldung "invalid pointer access" in der Zeile printf(shape.name); //ERROR (!?) enden, obwohl wir scheinbar garantiert ein Objekt in der Funktion TestShapePointer erzeugen. Der Punkt ist, dass tatsächlich eine NULL-Referenz anstelle von shape übergeben wurde. Das heißt, die Form innerhalb der Funktion und die übergebene Form sind unterschiedliche Objekte! Daher ist nach dem Verlassen der Funktion shape immer noch gleich NULL, und der shape-Zeiger innerhalb der Funktion ist verloren (auf dem Stack gelöscht). Also.Ist es möglich, ein Array mit Objekten verschiedener Typen zu erstellen?
Nehmen wir dieses Beispiel:
//---
Wie erhält man Zugriff auf Methoden geerbter Klassen?
Wie kann man auf Methoden von Vererbungsklassen zugreifen?
Haben Sie versucht, einen Zieltyp zu werfen?
Nein. Das ist das erste Mal, dass ich davon höre. Wo kann ich darüber lesen?
Die übliche Typumwandlung, hier ein Beispiel:
Haben Sie versucht, auf den Zieltyp zu casten?
Scheiße, und danach reden Sie über Sprachsicherheit?
Wäre es nicht besser, Polymorphismus zu verwenden?
Es geht ungefähr so: