Fragen zu OOP in MQL5 - Seite 41

 
Igor Makanu:

Ich habe mir die Ergebnisse meines Kampfes mit OOP-artigem Code angesehen - hmmm... ausgezeichnet! ))))


Ich habe eine Frage, aber in meinem Code, na ja, genau drei Mal, verwende ich eine Konstruktion wie:

ruft alle in privaten Methoden, aber gibt es eine "Jedi-Methode?", um im Quellcode von CheckPointer(m_order)==POINTER_INVALID wegzukommen

Ich frage nach einigen get / set

keine besonderen Probleme, sondern sozusagen eine Laune, oder wenn der Wissensdurst über OOP-Methoden in C++ noch nicht gestillt ist

Wenn die Frage ist "viele Buchstaben", dann !CheckPointer(mPtr), und wenn die Funktion aufrufen, Sie initialisieren alle Zeiger auf NULL in den Konstruktor und vergleichen Sie es in den Code, nicht zu vergessen, wenn das Löschen ptr; ptr=NULL;

 
Igor Makanu:

Ich habe mir die Ergebnisse meines Kampfes mit OOP-artigem Code angesehen - hmmm... ausgezeichnet! ))))


Ich habe eine Frage, aber in meinem Code, na ja, genau drei Mal, verwende ich eine Konstruktion wie:

ruft alle in privaten Methoden, aber gibt es eine "Jedi-Methode?", um im Quellcode von CheckPointer(m_order)==POINTER_INVALID wegzukommen

Ich frage nach einigen get / set

keine besonderen Probleme, sondern sozusagen eine Laune, oder wenn der Wissensdurst über OOP-Methoden in C++ noch nicht gestillt ist


Igor, schau dir dieses Beispiel an, ich glaube, das ist es, was du wissen willst.

 
Vladimir Simakov:

Wenn die Frage "viele Buchstaben" lautet, dann !CheckPointer(mPtr), und wenn in einem Funktionsaufruf, initialisieren Sie alle Zeiger auf NULL im Konstruktor und vergleichen Sie damit im Code, nicht zu vergessen beim Löschen von ptr; ptr=NULL;

Nun, und das hier, für Zucker:

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)
 
Igor Makanu:

Keine besonderen Probleme, aber sozusagen aus einer Laune heraus, oder weil der Durst nach dem Erlernen von OOP-Methoden in C++ noch nicht gestillt ist.

Ich empfehle dringend, dass Sie alle Felder der Klasse im Konstruktor mit Standardwerten initialisieren. Der Punkt ist, dass, wenn Sie dies tun wollen:

void foo(){
   CClass someClass;
   someClass.DoSomething();
}

wird niemand die Felder Ihrer Klasse initialisieren und es werden unsinnige Werte angezeigt.

 
Vladimir Simakov:

Und das für Zucker:

Nein, ich habe die Definitionen fast aufgegeben, ich möchte nur nichts einpacken, wie ich vor ein paar Wochen schrieb - ich möchte erst einmal reinen OOP-Stil-Code sehen, Flexibilität und Möglichkeiten bewerten

HH: Ich habe gerade Nachkommen bei der Erstellung in define verpackt, um nicht die gleiche Initialisierung auf 3 Zeilen zu schreiben, es ist einfacher, Methoden später hinzuzufügen, d.h. im Quellcode auf einer Zeile so weit

#define  CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder(__FUNCTION__,getDealType()==BUY ? SELL : BUY));
Roman:


Igor, schauen Sie sich dieses Beispiel an, ich glaube, das ist es, was Sie fragen.

nein, ich meine das Äquivalent in c# - Operator ?? (Null-Join-Operator), etwas ähnliches in der Logik möchte ich im C++-Stil sehen


UPD:

Wladimir Simakow:

Ich empfehle dringend, alle Felder einer Klasse im Konstruktor mit Standardwerten zu initialisieren. Der Punkt ist, dass, wenn Sie dies tun wollen:

Wenn Sie um ein Makro bitten, wird niemand die Felder Ihrer Klasse initialisieren, und es wird unsinnige Werte geben.

das ist, was ich tat, Konstruktor mit Initialisierung alles und alles in der Basisklasse, Nachkommen initialisieren die Basisklasse:

deshalb habe ich es in ein Makro verpackt, damit ich nicht vergesse, es richtig zu initialisieren ))))

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   virtual void NextStepStrategy(void) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu:

Nein, ich habe die Definitionen fast aufgegeben, ich möchte nur nichts einpacken, wie ich vor ein paar Wochen schrieb - ich möchte erst einmal reinen OOP-Code sehen, Flexibilität und Möglichkeiten bewerten

ZS: nur umhüllte Nachkommen in define bei der Erstellung, um nicht die gleiche Initialisierung auf 3 Zeilen zu schreiben, ist es einfacher, Methoden später hinzuzufügen, d.h. im Quellcode auf einer Zeile so weit

nein, ich meine das Äquivalent in c# - Operator ?? (Null-Join-Operator), möchte ich etwas Ähnliches in der Logik im C++-Stil sehen

Der Präprozessor ist eine Zeitverschwendung. Zusammen mit den Vorlagen sind sie die stärksten Werkzeuge. Es scheint keine Entsprechung des Operators ?? zu geben. C++ ist in dieser Hinsicht etwas härter im Nehmen.
 
Vladimir Simakov:
Ihre Weigerung, den Präprozessor einzusetzen, ist vergeblich. Zusammen mit Vorlagen sind sie die mächtigsten Werkzeuge. Es scheint keine Entsprechung des Operators ?? zu geben. C++ ist in dieser Hinsicht etwas härter im Nehmen.

Ich bin immer noch in einem Kampf für reine OOP-Stil, ich möchte alle OOP-Techniken zu lernen, während es ein Asset auf dem Forum;)

Mit dem Präprozessor bin ich auf dem Laufenden, aber ... Ich denke, ich sollte es nicht missbrauchen, zumindest nicht mein Stil, ich könnte es vermasseln, und ich werde sicherlich nicht in der Lage sein, Code mit mehreren Makrosubstitutionen zu lesen, und wie man nach Fehlern sucht... nun, es ist einfacher, neu zu schreiben - also, noch nicht notwendig


Vorlagen... Nun, ich mag nicht, was die Entwickler in SB anbieten, ich habe sie alle durchgesehen, es ist schwer zu sagen, zu welchem Zweck sie in SB aufgenommen wurden, vielleicht ist ihre Zeit noch nicht gekommen

über die Portierung von C++-Vorlagen nach MQL - es ist an der Zeit, wie die Diskussion gezeigt hat, dass in den meisten Fällen C++-Vorlagen eine Feinabstimmung für MQL erfordern - es ist einfacher, zu .dll zurückzukehren und MQL nicht zu stören ))))

 
Igor Makanu:

Ich bin immer noch in einem Kampf für reine OOP-Stil, ich möchte alle OOP-Techniken zu lernen, während es ein Asset auf dem Forum;)

Mit dem Präprozessor bin ich auf dem Laufenden, aber ... Ich denke, ich sollte es nicht missbrauchen, zumindest nicht mein Stil, ich könnte es vermasseln, und ich werde sicherlich nicht in der Lage sein, Code mit mehreren Makrosubstitutionen zu lesen, und wie man nach Fehlern sucht... nun, es ist einfacher, neu zu schreiben - also, noch nicht notwendig


Vorlagen... Nun, ich mag nicht, was die Entwickler in SB anbieten, ich habe sie alle durchgesehen, es ist schwer zu sagen, zu welchem Zweck sie in SB aufgenommen wurden, vielleicht ist ihre Zeit noch nicht gekommen

über die Portierung von C++-Vorlagen nach MQL - es ist an der Zeit, wie die Diskussion gezeigt hat, dass in den meisten Fällen C++-Vorlagen eine Feinabstimmung für MQL erfordern - es ist einfacher, zu .dll zurückzukehren und MQL nicht zu stören ))))

Auf diese Weise können Sie Ihre eigenen Vorlagen erstellen.))
 
Vladimir Simakov:
Auf diese Weise können Sie selbst Vorlagen schreiben.)))

Ja, ))))

Ich habe fertig lesen Sie die Hilfe und übersprungen Override, Gott sei Dank alles in Makros ist, bearbeitet, na ja, genau in einem copy-paste

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   void NextStepStrategy(void) override {FUNC;}}

UPD:

Nein, das ist es nicht, es wurde für die Erlaubniskontrolle selbst ausgegeben, keine Notwendigkeit für eine öffentliche Methode!

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private:\
void NextStepStrategy(void) override {FUNC;}\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }}
 
Vladimir Simakov:

Und dann gibt es noch das hier, für Zucker:

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)

Ich wollte schreiben, was ich früher hatte, anstatt

if( CheckPointer(m_order)==POINTER_INVALID )

Es war so:

if(m_order==NULL)

erinnerte mich aber daran, wie man Makro-Ersetzungen in MQL überprüft

void OnStart()
{  int a = 0;
#ifdef NULL
   a = 1;
#endif

   Print("a = ",a);
   Print("POINTER_INVALID = ",POINTER_INVALID);
   Print("NULL = ",(int)NULL);   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) a = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID = 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


und wenn ich mich richtig erinnere, war es Anfang des Jahres möglich, NULL in das Protokoll zu drucken und dort 0 zu erhalten, jetzt erscheint ein Fehler

D.h. das Verhalten NULL as if sollte sich in Zukunft nicht ändern, aber was dort anstelle von NULL ersetzt wird, ist nicht klar, wahrscheinlich wenn diese Situation jetzt geprüft wird, wie geschriebenif(CheckPointer(m_order)==POINTER_INVALID)) ) ist es sozusagen der richtige Code))

Grund der Beschwerde: