Fragen zu OOP in MQL5 - Seite 74

 
Vladimir Simakov:

Es gibt keine Zeiger hier) Es ist ein Handle für die Klasse, und die Arbeit mit ihm ist ähnlich wie die Arbeit mit einem Zeiger, aber das ist, wo die gemeinsame Basis endet.

Mein neugieriger Geist und meine ungezogenen Hände haben mich zwei Tage und zwei Nächte lang verfolgt

Ich habe versucht, dynamisch erstellte Objekt aus dem Geltungsbereich zu entfernen - in der Funktion, tastend Methode, aber schließlich habe ich die Lösung:

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* &t)
{
   delete t;
}

das es löscht, aber ich kann es nicht so herausfinden.... und ich habe keine ähnlichen Funktionssignaturen für die Übergabe der Zeiger gefunden


Hier ist eine weitere Frage:

Wie kann ich als Ergebnis einer Funktion einen Zeiger auf ein Objekt per Referenz zurückgeben?

Ich möchte etwas in dieser Art machen:

CTest ret_CTest()
{
   CTest *result = new CTest;
   return(result);
}


es ist möglich, CTest * ohne Probleme zurückzugeben, aber wie ich schrieb ret_CTest() - es gibt einen Fehler

 
Igor Makanu:

Zwei Tage und zwei Nächte hielten mich mein wissbegieriger Geist und meine frechen Hände auf Trab

versucht, dynamisch erstellte Objekt aus dem Geltungsbereich zu entfernen - in der Funktion, Bauchgefühl-Methode, aber schließlich bekam die Lösung:

das es löscht, aber ich kann es nicht so herausfinden.... und ich konnte keine ähnlichen Funktionssignaturen für die Übergabe von Zeigern in der Hilfe oder sat finden

Was meinen Sie damit, dass es außerhalb des Geltungsbereichs liegt? Sie haben es an eine Funktion übergeben, also ist es dort sichtbar.)

s.s.void deleteCTest(CTest* &t) ohne das & sollte auch funktionieren, oder?

Um sie wirklich außerhalb des Bereichs, in dem sie erstellt wurde, und möglicherweise automatisch zu entfernen, müssen Sie ... Pssst... bevor es jemand hört... Pattern Factory... schneller lesen und löschen...

 

Igor Makanu:


aber wie kann man als Ergebnis einer Funktion einen Zeiger auf ein Objekt per Referenz zurückgeben?

Sie können CTest * ohne Probleme zurückgeben, aber wie ich schrieb ret_CTest() - es gibt einen Fehler
Wenn Sie koscher wollen
CTest& Foo();
, noch nicht, aber wenn ja:
CTest Foo();

Wenn eine Klasse einen Kopierkonstruktor hat, dann sollte sie auch einen Kopierkonstruktor haben.

CTest(CTest &other)...
 
Aleksey Mavrin:

s.w.void deleteCTest(CTest* &t) ohne dies & sollte auch funktionieren, oder nicht?

Schau es dir an, du wirst etwas Neues lernen ;)

Ich habe schon oft geschrieben, dass die MQL-Zeiger eine sehr lehrreiche Sache sind ))))


Vladimir Simakov:
Wenn Sie koscher wollen, noch nicht, aber wenn ja:

Wenn Sie einen Zeiger verwenden wollen, muss die Klasse einen Kopierkonstruktor haben.

Nochmals, ich muss nachdenken

Ich habe den Verdacht, dass GetPointer() einige Tricks anwenden kann... aber es ist keine Tatsache.... Diese "Sprünge durch Raum und Zeit" - über Zeiger und implizite Dereferenzierung in MQL - sind für mich nicht mehr nachvollziehbar! (((

 
Igor Makanu:

Schau es dir an, du wirst eine Menge lernen ;)

Ich habe schon oft geschrieben, dass Zeiger in MQL eine sehr lehrreiche Sache sind ))))

Es löscht Zeiger, kann aber _test keinen neuen Wert zuweisen. Übrigens, MQL hat nichts damit zu tun)))

 
Igor Makanu:

Schau es dir an, du wirst eine Menge lernen ;)

Ich habe Ihnen immer wieder gesagt, dass Zeiger in MQL sehr lehrreich sind ))))


Nochmals, ich muss nachdenken

Ich habe den Verdacht, dass GetPointer() einige Tricks anwenden kann... aber es ist keine Tatsache.... Diese "Sprünge durch Raum und Zeit" - über Zeiger und implizite Dereferenzierung in MQL - sind für mich nicht nachvollziehbar! (((

Es ist alles in Ordnung hier)))) Schalten Sie einfach die Schärfe ab, hier gibt es nicht einmal einen Hauch davon))))

 
Igor Makanu:

Schau es dir an, du wirst eine Menge lernen ;)

Ich habe Ihnen immer wieder gesagt, dass Zeiger in MQL sehr lehrreich sind ))))

Ich habe es überprüft. Es löscht gut ohne &)

Ich habe es in MT4 und MT5 versucht und vergleiche )

class CTest
{
public:
   CTest() { Print(__FUNCTION__); }
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest();
   deleteCTest(_test);
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* t)
{
   delete t;
}
 
Aleksey Mavrin:

Gut geprüft. Es löscht perfekt ohne &)

Ich habe es in MT4 und MT5 versucht und vergleiche )

Kein vollständiges Beispiel, ich bin heute darauf gestoßen.

Es wird nicht ohne & funktionieren.

class CTest
{
public:
   ~CTest() { Print(__FUNCTION__); }
};
//+------------------------------------------------------------------+
void OnStart()
{
   CTest* _test = new CTest;
   deleteCTest(_test);
   delete _test;
}
//+------------------------------------------------------------------+
void deleteCTest(CTest* & t)
{
   delete t;
   t = new CTest;
}
//+------------------------------------------------------------------+

Vladimir Simakov:

Mir geht es gut hier))) Ich bin nicht auf der Suche nach scharfen Gegenständen, aber ich bin sicher, dass es auch ohne geht &)).


Ich bin nicht auf der Suche nach Sharp, ich bin immer noch im Umgang mit MQL, kann ich fragen, was ich nicht verstehe.

 
Igor Makanu:

kein vollständiges Beispiel, ich bin heute darauf gestoßen.

es wird nicht so funktionieren ohne &

Sicher wird es das. Sie übergeben einen Zeiger als Wert, daher wird eine Kopie des Zeigers erstellt. Sie verwenden es, um das Objekt festzunageln und ein neues Objekt für den Zeiger zu erstellen, der in der Funktion erstellt wurde. Dies ist C++, willkommen))))
 
Igor Makanu:

kein vollständiges Beispiel, habe ich heute gefunden

es wird nicht ohne & funktionieren



Meiner Meinung nach hat das nichts mit Referenzen zu tun, sondern nur mit der Tatsache, dass das Funktionsargument per Zeiger übergeben werden muss, wenn der Wert nach der Ausführung der Funktion gespeichert werden soll. Das Gleiche passiert zum Beispiel mit einem Datei- oder Indikator-Handle, die keine Referenzen sind.

Das war schon immer der Standard in C++, auch wenn ich mich nicht mehr genau daran erinnern kann.