Fragen zu OOP in MQL5 - Seite 43

 
Igor Makanu:

SZS: Ihre Beiträge sind fast immer vernünftig, aber die Präsentation des Materials, na ja, nicht gerade mit guten Absichten, natürlich Ihr Geschäft, aber imho, Sie wollen helfen - helfen, wollen klug zu sein, na ja, es stellt sich oft heraus, dass so

Das Spielfeld lässt einen denken... Sie haben geschrieben, dass Sie angefangen haben, über den Code nachzudenken, und vorher haben Sie auf Zuruf programmiert...

 
A100:

Das Spielfeld lässt einen denken... Sie haben geschrieben, dass Sie angefangen haben, über den Code nachzudenken, und dass Sie vorher in aller Eile programmiert haben.

Hmm ... Nun, ich habe noch nie ein Doddle geschrieben! - Das ist eine Tatsache!

SZZY: Ich aktualisiere das Thema in regelmäßigen Abständen nicht aus Unwissenheit oder weil ich das Material selbst nicht finden kann, sondern weil es einen Vertreter gibt, dessen Meinung mich interessiert ;)

ZSYS: das Ergebnis der Kommunikation - eher überdacht, warum die Verwendung von Modifikatoren, warum wir brauchen ein Get / Set - es spart Zeit auf der Bühne der Entwicklung, mit dem geschickten Einsatz des Compilers, die Prüfung der geschriebenen Code wird sofort erfolgreich sein - hier wirklich die Augen geöffnet, die eine Bereicherung für das Thema war, noch einmal, danke!

 
Koldun Zloy:

Hier ist ein Beispiel:

Aus Ihrem Code geht nicht klar hervor, wozu die Schnittstelle dient, daher habe ich sie verworfen.

Natürlich kenne ich Ihre Aufgabe nicht vollständig, aber mit 99,99%iger Wahrscheinlichkeit ist sie nicht erforderlich.

Abgefahren...

 
Igor Makanu:

Ähm ... Ich habe noch nie in einer Unschärfe geschrieben! - Das ist eine Tatsache!

SZZY: Ich aktualisiere dieses Thema in regelmäßigen Abständen nicht aus Unwissenheit oder weil ich selbst kein Material finden kann, sondern weil es einen Aktivposten gibt, dessen Meinung mich interessiert ;)

SZZY: das Ergebnis der Kommunikation - eher überdacht, warum die Verwendung von Modifikatoren, warum wir brauchen ein Get / Set - es spart Zeit bei der Entwicklung, mit geschickten Einsatz des Compilers, die Prüfung der geschriebenen Code wird sofort erfolgreich sein - hier wirklich die Augen geöffnet, die eine Bereicherung für das Thema war, noch einmal, danke!

Es ist sehr gut, dass Sie etwas gelernt haben. Aber Sie können viel mehr Fortschritte machen, wenn Sie Stroustrups C++ lesen.

Aber Sie sollten besser keine Artikel und Videos über Habra lesen. Jeder kann dort schreiben. Sie werden Sie nur verwirren.

 

Es hat sich eine Frage ergeben.


Es gibt ein Bedienfeld mit Tasten, wobei jede Taste bestimmte Funktionen ausführt. Die Funktionen, die durch das Drücken einer der Schaltflächen, nennen wir sie Exit1, aufgerufen werden, sollten in einer eigenen Klasse CExit1 untergebracht werden.

Diese Funktionen verwenden jedoch einige globale Variablen und Methoden anderer Objekte.

Ich habe nicht an großen Projekten teilgenommen. Ich würde gerne von einem Experten wissen, wie man es richtig macht?

Ich programmiere oft so, dass wenn eine mq4-Datei kompiliert wird, alle Klassen und Include-Dateien ohne Fehler geladen werden und der EA richtig funktioniert. Wenn ich jedoch eine Klasse separat kompiliere, erhalte ich Warnungen, weil einige externe Variablen und Funktionen nicht sichtbar sind.

Hier ist meine Frage. Muss eine Klasse sich selbst fehlerfrei kompilieren, d.h. sie muss alle Kopien der globalen Variablen von EA, Objektreferenzen usw. enthalten, die verwendet werden? Wenn ja, wann wäre der beste Zeitpunkt, dies zu tun? Wenn es viele interagierende Objekte gibt, wie kann man sie so anordnen, dass es weniger Verwirrung gibt? Erstellen Sie Diagramme Ihrer Programme, wenn sie sich ausbreiten?

Teilen Sie mit, wie Sie die Arbeit mit Ihren Objekten schreiben und umsetzen.

 
Vasiliy Pushkaryov:

Es hat sich eine Frage ergeben.


Es gibt ein Bedienfeld mit Tasten, wobei jede Taste bestimmte Funktionen ausführt. Die Funktionen, die durch das Drücken einer der Schaltflächen, nennen wir sie Exit1, aufgerufen werden, sollten in einer eigenen Klasse CExit1 untergebracht werden.

Diese Funktionen verwenden jedoch einige globale Variablen und Methoden anderer Objekte.

Ich habe nicht an großen Projekten teilgenommen. Ich würde gerne von einem Experten wissen, wie man es richtig macht?

Ich programmiere oft so, dass, wenn eine mq4-Datei kompiliert wird, alle Klassen und Include-Dateien ohne Fehler geladen werden und der EA richtig funktioniert. Wenn eine Klasse jedoch separat kompiliert wird, können einige Warnungen erscheinen, da einige externe Variablen und Funktionen für die Klasse nicht sichtbar sind.

Die Frage ist. Ist es notwendig, dass die Klasse selbst fehlerfrei kompiliert werden kann, d. h. dass sie bereits alle verwendeten Kopien globaler Variablen, Verweise auf Objekte usw. enthält? Wenn ja, wann wäre der beste Zeitpunkt, dies zu tun? Wenn es viele interagierende Objekte gibt, wie kann man sie so anordnen, dass es weniger Verwirrung gibt? Erstellen Sie Diagramme zu Ihren Programmen, wenn diese sich ausbreiten?

Teilen Sie mit, wie Sie die Arbeit mit Ihren Objekten schreiben und umsetzen.

Globale Variablen und Statistiken, mit Ausnahme derer, die der Plattform eigen sind, sind eine üble Sache. Und alle Entitäten (Gruppen von Klassen) müssen isoliert sein und miteinander nach einem Protokoll (dem der Schnittstelle) und nichts anderem kommunizieren.

Das ist natürlich das Ideal :-) Im wirklichen Leben treffen Sie die Entscheidung und unterstützen sich selbst, denn niemand sonst kennt Ihr Projekt, Ihre Idee und Ihren Stil.

 
struct A
{
   int x,y;
};

//+------------------------------------------------------------------+
void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   //b = c = a;  //'operator=' - parameter passed as reference, variable expected
}

1. Warum lässt es sich nicht kompilieren?

2. Gibt es einen Hack, um operator= zu beschreiben und den nativen Kopieroperator darin zu verwenden? .... d.h. eine Möglichkeit zum Aufruf von::=

 
Igor Makanu:

1. Warum lässt es sich nicht kompilieren?
2. Gibt es einen Hack, um operator= zu beschreiben und den nativen Kopieroperator darin zu verwenden? .... d.h. eine Möglichkeit zum Aufruf von ::=

1) Der Standard-Zuweisungsoperator in MQL gibt den Datentyp void zurück;
2) Sie können so vorgehen:

struct A{
   int x,y;
   
   A(){}
   A(const A &a){
      this.x = a.x;
      this.y = a.y;
   }
   A operator=(const A &a){
      this.x = a.x;
      this.y = a.y;
      return a;
   }
};

void OnStart(){
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;  
}
 
Sergey Dzyublik:

1) Der Standard-Zuweisungsoperator in MQL gibt den Datentyp void zurück;

sind nicht einverstanden:

struct A
{
   int x[];
};
//+------------------------------------------------------------------+
A myfunc(const int size)
{
   A result;
   ArrayResize(result.x, size);
   for(int i = 0; i < size; i++) result.x[i] = i + 1;
   return(result);
}
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   a = myfunc(5);
   A b;
   b = a;            // скопировали
   b.x[0] = 99;      // изменили 1-й элемент, чтобы убедиться, что это копия а, а не ссылка как в C#
   ArrayPrint(a.x);
   ArrayPrint(b.x);
}
//+------------------------------------------------------------------+

2020.04.18 18:54:03.855 tst (EURUSD,H1) 1 2 3 4 5

2020.04.18 18:54:03.855 tst (EURUSD,H1) 99 2 3 4 5


Der Standard-Zuweisungsoperator gibt eindeutig den vollständigen Datentyp zurück und erstellt eine Kopie, oder von welcher Leere reden wir?


2. das Beispiel ist gut, aber ich möchte die Möglichkeit des Kopierens in Array-Strukturen durch Standard-Kopier-Operator zu bewahren - ich überprüfte es, im Allgemeinen funktioniert es ganz gut mit dynamischen Arrays, es gibt ein paar Nuancen, aber die Frage ist anders für jetzt

 
Igor Makanu:

Der Standard-Zuweisungsoperator gibt eindeutig den vollständigen Datentyp zurück und erstellt eine Kopie, oder von welcher Leere ist die Rede?

Falsch.

Definieren Sie einfach Ihren operator=, der dies zurückgibt, und Sie werden den Unterschied sehen.

Sie können es sehen, wenn das Ergebnis der Zuweisung erneut zugewiesen wird.

struct A
{
   int x;
   int y;
   
   A operator=( const A& a )
   {
      x = a.x;
      y = a.y;
      
      return this;
   }
};

void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;
}