Diskussion zum Artikel "Grundlagen der objektorientierten Programmierung" - Seite 3

 

1) Ich dachte, es gäbe hier einen Fehler:

Abschnitt: Parameterübergabe an den Konstruktor

"Die Funktion Init() wird im Abschnitt private Abschnitt, um sicherzustellen, dass die Klasse reinitialisiert werden kann."

möglich:

Init()-Funktion wird in den öffentlichen Abschnitt, um die Möglichkeit der Reinitialisierung der Klasse zu gewährleisten.

2) Bitte geben Sie ein Beispiel für die Verwendung der Funktion"Erstellen eines Arrays mit Klasseninstanzen (Objekten)" für den Abschnitt "Objektarray". Leider kann ich nicht herausfinden, "wofür dies verwendet wird".

3) Im Abschnitt "More about encapsulation (private, protected, public)" wird die Basisklasse->Klassennachkomme nur am Rande erwähnt. Vielleicht sollte dieses Datum(class Class: public CBase) am Anfang des Abschnitts erklärt werden, denn ich habe es erst später bemerkt.

4) nicht gefunden:Abb.6. Die Sichtbarkeit der "Extra"-Funktion (roter Pfeil) wird durch den Typ des Zeigers bestimmt, mit dem die Klasse geladen wird. Dieses Beispiel ist im Anhang in der Datei OOP_sDefaultVirtual_1.mq5 zu finden.

5) Ich habe keinen klaren Hinweis darauf gefunden, was eine Bibliothek ist. Offenbar eine Möglichkeit, die Klasse(n) von Funktionen zu speichern? d.h. ähnlich wie die Include-Datei, nur dass die Include-Datei als Quelle und die Bibliothek als kompilierte DLL gespeichert wird?

Herzlichen Dank für den Artikel! Ich war besonders erfreut über die konsistente Darstellung des Materials.

Документация по MQL5: Основы языка / Функции / Передача параметров
Документация по MQL5: Основы языка / Функции / Передача параметров
  • www.mql5.com
Основы языка / Функции / Передача параметров - Документация по MQL5
 
bivmail:

1) Ich dachte, es gäbe hier einen Fehler:

Abschnitt: Parameterübergabe an den Konstruktor

"Die Funktion Init() wird im Abschnitt private Abschnitt, um sicherzustellen, dass die Klasse reinitialisiert werden kann."

möglich:

Init()-Funktion wird in den öffentlichen Abschnitt, um die Möglichkeit der Reinitialisierung der Klasse zu gewährleisten.

2) Bitte geben Sie ein Beispiel für die Verwendung der Funktion"Erstellen eines Arrays mit Klasseninstanzen (Objekten)" für den Abschnitt "Objektarray". Leider kann ich nicht herausfinden, "wofür dies verwendet wird".

3) Im Abschnitt "More about encapsulation (private, protected, public)" wird die Basisklasse->Klassennachkomme nur am Rande erwähnt. Vielleicht sollte dieses Datum(class Class: public CBase) am Anfang des Abschnitts erklärt werden, denn ich habe es erst später bemerkt.

4) nicht gefunden:Abb.6. Die Sichtbarkeit der "Extra"-Funktion (roter Pfeil) wird durch den Typ des Zeigers bestimmt, mit dem die Klasse geladen wird. Dieses Beispiel ist im Anhang in der Datei OOP_sDefaultVirtual_1.mq5 zu finden.

5) Ich habe keinen klaren Hinweis darauf gefunden, was eine Bibliothek ist. Offenbar eine Möglichkeit, die Klasse(n) von Funktionen zu speichern? d.h. ähnlich wie die Include-Datei, nur dass die Include-Datei als Quelle und die Bibliothek als kompilierte DLL gespeichert wird?

Herzlichen Dank für den Artikel! Ich war besonders erfreut über die konsistente Darstellung des Materials.

1. Ja.

2. Es gibt ein Beispiel im Abschnitt "Array of objects", eigentlich ist der ganze Abschnitt ein Beispiel mit einer Beschreibung.

3. Es wird im Abschnitt "Verwendung von OOP, um die Logik des Programmablaufs zu ändern" betrachtet.

4. Die Worte "Dieses Beispiel befindet sich im Anhang in der Datei..." bedeutet, dass die Datei ein Beispiel für den in der Abschnittsüberschrift angegebenen Abschnitt enthält. Das bedeutet nicht, dass die Beispiele alles wiederholen, was in dem Artikel beschrieben wird. Diese Beispiele gibt es vielleicht gar nicht, alles ist im Artikel beschrieben. Aber die Beispiele sind da, Sie können sie als Grundlage nehmen und experimentieren. Der Artikel ist primär, die Beispiele sind sekundär.

5. Уже давно указано: http://ru.wikipedia.org/wiki/%C1%E8%E1%EB%E8%EE%F2%E5%EA%E0_(%EF%F0%EE%E3%F0%E0%EC%EC%E8%F0%EE%E2%E0%ED%E8%E5)

[Gelöscht]  
Danke. Guter Artikel.
[Gelöscht]  

Sehr interessanter Artikel, der in einer kompetenten, "zugänglichen" Sprache geschrieben ist.

Vielen Dank an den Autor.

 
Danke, Mann. Dieser Artikel hat mir sehr geholfen. Ich war dabei, meinen EA auf OOP umzustellen und hatte ein spezielles Problem mit Arrays von Klassen. Die dynamischen Zeiger sind klar und perfekt erklärt. Nochmals vielen Dank.
 
Ein sehr gut geschriebener Artikel, den ich dank des Autors endlich verstanden habe.
 

Ich habe zwei Beispiele für Code, die auf diesem Artikel basieren/kopiert wurden. Beide erstellen ein Array von Zeigern auf eine Klasse und löschen sie beim Beenden. Eines wird jedoch mit einem Speicherleck beendet, das andere ohne ein Speicherleck. Der einzige Unterschied besteht darin, dass im zweiten Beispiel der "Alert" im Destruktor auskommentiert ist. Wenn der Alert im Destruktor entfernt wird, entsteht ein Speicherleck. Das ist sehr seltsam. Kann mir das jemand erklären? Bitte helfen Sie mir, das macht mich wahnsinnig.

Am Ende der Code-Beispiele aus diesem Artikel habe ich ein extrem einfaches Code-Beispiel eingefügt, das ich geschrieben habe und das ebenfalls ein Speicherleck hat. ???? Auch an diesem letzten Code-Beispiel ist nichts kompliziert...


Dieser Code funktioniert ohne ein Speicherleck:

class CName
  {
private:
   int               m_arg; // Variable für die Instanz
public:
                     CName(int aArg)
     { // Konstrukteur
      m_arg=aArg;
      //Alert("Konstruktor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Destruktor
      Alert("Destructor "+IntegerToString(m_arg));
     }
  };
//---
CName *cname[]; // Array

void OnInit()
  {
// Array vorbereiten, um zehn Instanzen der Klasse zu laden
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Instanzen laden
      cname[i]=new CName(i);
     }
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // Am Ende alle Instanzen aus dem Speicher entladen
      delete(cname[i]);
     }
}

Meldungen aus dem Expertenprotokoll, beachten Sie, dass kein Speicherleck vorliegt:

PI 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destructor 0

KP 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destruktor 1

JG 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destruktor 2

DE 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destruktor 3

LF 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destruktor 4

OM 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destruktor 5

FD 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destruktor 6

IK 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destruktor 7

HS 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Zerstörer 8

CJ 0 OOP_sConstDestr_2 (EURUSD,M1) 13:57:59 Destruktor 9

Dieser Code beendet sich MIT einem Speicherleck!!!! Warum????????? Der einzige Unterschied ist das Auskommentieren des 'Alert' im Destruktor...

class CName
     {
private:
   int               m_arg; // Variable für die Instanz
public:
                     CName(int aArg)
     { // Konstrukteur
      m_arg=aArg;
      //Alert("Konstruktor "+IntegerToString(m_arg));
     }
                    ~CName()
     { // Destruktor
      //Alert("Destruktor "+IntegerToString(m_arg));
     }
  };
//---

CName *cname[]; // Array

void OnInit()
  {
// Array vorbereiten, um zehn Instanzen der Klasse zu laden
   ArrayResize(cname,10);

   for(int i=0;i<10;i++)
     { // Instanzen laden
      cname[i]=new CName(i);
     }
  }

//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   for(int i=0;i<10;i++)
     { // Am Ende alle Instanzen aus dem Speicher entladen
      delete(cname[i]);
     }
}

Meldungen aus dem Expertenprotokoll, beachten Sie den ausgelaufenen Speicher:

FM 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 10 nicht gelöschte Objekte übrig

EG 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 10 Objekte vom Typ CName übrig

GO 1 OOP_sConstDestr_2 (EURUSD,M1) 13:51:19 200 Bytes an ausgelaufenem Speicher

Letztes Beispiel, mein Code, sehr einfach, aber mit einem Speicherleck beendet....

class CCandleStick
{
public:
   CCandleStick() { };
  ~CCandleStick() { };
};

CCandleStick *cCandleArray[];

//+------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion|
//+------------------------------------------------------------------+
void OnInit()
  {
   ArrayResize(cCandleArray, 10);
   for (int i = 0; i < 10; i++) {
      cCandleArray[i] = new CCandleStick();
   }   
  }
//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   for (int i = 0; i < 10; i++) {
      delete(cCandleArray[i]);
   }   
   Print("Last Error- ", GetLastError(), "   Current time: ", TimeCurrent());
  }

Meldungen aus dem Expertenprotokoll, beachten Sie den ausgelaufenen Speicher:

MR 0 tester (EURUSD,M1) 14:07:23 Last Error- 0 Aktuelle Zeit: 2013.02.06 23:07:23

FL 1 tester (EURUSD,M1) 14:07:23 10 nicht gelöschte Objekte übrig

KN 1 tester (EURUSD,M1) 14:07:23 10 Objekte vom Typ CCandleStick übrig

JS 1 tester (EURUSD,M1) 14:07:23 160 Bytes an ausgelaufenem Speicher



Documentation on MQL5: Date and Time / TimeCurrent
  • www.mql5.com
Date and Time / TimeCurrent - Documentation on MQL5
 
wulidancing:

Ich habe zwei Beispiele...

Ich habe alle drei Varaints überprüft. Alle drei sind identisch. Alle sind normal. Keine gibt Lecks. In diesen Beispielen kann es nicht sein - wir haben das Array, in jedem Element des Arrays haben Instanz, beim Beenden löschen wir alle Objekte. Objekte erstellen keine Kopien von sich selbst, können Sie nicht verpassen, um samething löschen. Wenn ein Objekt eine Kopie von sich selbst erstellt, dann können wir Schwierigkeiten mit dem Löschen haben, sehr leicht etwas zu verpassen. Zeigen Sie Varianten, die wirklich undicht sind.

Verwenden Sie die SRC-Schaltfläche, um den Code einzufügen (besser - Dateien anhängen).

Sorry für mein Englisch:)

MQL5.community - User Memo
  • 2010.02.25
  • MetaQuotes Software Corp.
  • www.mql5.com
You have just registered and most likely you have questions such as, "How do I insert a picture to my a message?" "How do I format my MQL5 source code?" "Where are my personal messages kept?" You may have many other questions. In this article, we have prepared some hands-on tips that will help you get accustomed in MQL5.community and take full advantage of its available features.
 
OOP ist eine moderne Programmiersprache, aber um sie zu verstehen und Code zu schreiben, brauchen wir viel Zeit und Mühe. Danke guter Artikel
 
Integer:

Ich habe alle drei Varaints überprüft. Alle drei sind identisch. Alle sind normal. Keine gibt Lecks. In diesen Beispielen kann es nicht sein - wir haben das Array, in jedem Element des Arrays haben Instanz, beim Beenden löschen wir alle Objekte. Objekte erstellen keine Kopien von sich selbst, können Sie nicht verpassen, um samething löschen. Wenn ein Objekt eine Kopie von sich selbst erstellt, dann können wir Schwierigkeiten mit dem Löschen haben, sehr leicht etwas zu verpassen. Zeigen Sie Varianten, die wirklich undicht sind.

Verwenden Sie die SRC-Schaltfläche, um den Code einzufügen (besser - Dateien anhängen).

Sorry für mein Englisch:)

Vielen Dank, dass Sie sich die Zeit genommen haben, zu antworten. Ich bin nicht sicher, ob Sie meine Folgefrage gesehen haben. Sie stand in einem separaten Kommentar, der wahrscheinlich gelöscht wurde, weil ich mich in diesem Forum nicht sehr gut auskenne. Ich habe jedoch versucht, alle drei Beispiele auf einem älteren Computer mit einer älteren Version von MetaTrader auszuführen. In der älteren Version schienen alle 3 gut zu funktionieren. Es wurde kein Fehler im Expertenprotokoll "Speicherleck" generiert, ich glaube, es war Build 560?Ich glaube, es war Build 560. Ich kann mich nicht erinnern, und ich habe den 560er auf den neuen Build 756 aktualisiert. Nach dem neuen Build habe ich die gleichen Probleme mit dem Speicherleck. Ist es möglich, dass der alte Build die Probleme mit dem Speicherleck nicht gemeldet hat, weil es keine Funktion war? Welchen Build verwenden Sie? Nochmals vielen Dank.