Fragen zu OOP in MQL5 - Seite 3

 

Wenn alle Schaltflächen jeweils nur mit einer Zeile arbeiten, erstellen Sie eine statische Variable in der Schaltflächenklasse, um die Zeile zu referenzieren. Aber nur das ist nicht sinnvoll, weil es die Möglichkeiten der Schaltflächenklasse einschränkt - man kann nicht zwei Paare von Schaltflächen erstellen, um mit zwei Zeilen parallel zu arbeiten.

Und die richtige Lösung für das Problem ist elementar - schreiben Sie eine Funktion, die Referenz auf die Zeile wird an die Funktion übergeben, und die Funktion übergibt diese Referenz an die gewünschten Schaltflächenobjekte. Sie brauchen keine Wunder in OOP zu suchen.

Oder Sie können eine Klasse schreiben, die zwei Schaltflächen erstellt.

 
Dmitry Fedoseev:

Wenn alle Schaltflächen jeweils nur mit einer Zeile arbeiten, erstellen Sie eine statische Variable in der Schaltflächenklasse, um die Zeile zu referenzieren. Aber das allein macht keinen Sinn, weil es die Möglichkeiten der Button-Klasse einschränkt - man kann nicht zwei Button-Paare erstellen, um mit zwei Zeilen parallel zu arbeiten.

Ja, ich habe vier Tastenpaare und vier Zeilen, also habe ich auch die statische Variable als Option verworfen.

Und die richtige Lösung des Problems ist elementar: Schreiben Sie eine Funktion, der Link zur Zeile wird an die Funktion übergeben, und dieser Link wird an die gewünschten Schaltflächenobjekte in der Funktion übergeben. Sie brauchen keine Wunder in OOP zu suchen.

Nun, oder schreiben Sie eine Klasse, die zwei Schaltflächen erstellt.

Und ich glaubte an die Wunder von OOP).

Danke für diese Optionen, ich werde darüber nachdenken, welche für mich am besten geeignet wäre.

 
Vasiliy Pushkaryov:

Helfen Sie mir, ein Problem zu lösen. Es gibt zwei Tasten und eine Linie. Wenn Sie eine Taste drücken, wird die Zeile in den Bearbeitungsmodus versetzt, und wenn Sie sie loslassen, wird die Zeile gelöscht. Die zweite Schaltfläche fixiert die Zeile, wenn sie angeklickt wird, und schaltet sie wieder in den Bearbeitungsmodus, wenn sie angeklickt wird. Jede Schaltfläche kann die Farbe und einige andere Eigenschaften des Linienobjekts ändern. Das Objekt "Linie" ist global definiert. Ist es möglich, eine Referenz auf das "Line"-Objekt an jede Schaltfläche unmittelbar nach der Erstellung von Schaltflächen zu übergeben, so dass bei der Bearbeitung der Referenzvariablen innerhalb der "Button"-Objekte alle Änderungen im globalen "Line"-Objekt gespeichert werden.

Im Folgenden habe ich ein vereinfachtes Skript skizziert, das anstelle eines Tastendrucks die Funktion addition() enthält, die den Zähler des Objekts "Line" erhöht. Ich verstehe, dass man das "Line"-Objekt als Funktionsargument per Referenz übergeben kann, aber gerade in der Arbeitsversion gibt es mehrere solcher Funktionen, so dass ich die Referenz am Anfang einmal übergeben möchte. Ist es z.B. möglich, dass Btn1.addition() oder Btn2.addition() die gLine.count erhöht?

So mache ich es jetzt auch:


Vielleicht ist dies der richtige Weg?

//+------------------------------------------------------------------+
class CLine
  {
public:
   int               count;
                     CLine(void){count=0;};
                    ~CLine(void){};
  };
//+------------------------------------------------------------------+
class CMyButton
  {
private:
public:
   CLine            *m_Line;
                     CMyButton(void):m_Line(NULL){};
                    ~CMyButton(void){};

   void bind(CLine *aLine) {m_Line=aLine;}
   void addition() {if(CheckPointer(m_Line)==POINTER_DYNAMIC){++m_Line.count;}}
  };


CMyButton  Btn1;
CMyButton  Btn2;

CLine *gLine;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   gLine = new CLine;
   Btn1.bind(GetPointer(gLine));
   Btn2.bind(GetPointer(gLine));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Print("Line.count=", gLine.count);
   Btn1.addition();
   Print("Line.count=", gLine.count, "  Btn1.m_Line.count=", Btn1.m_Line.count);
   Btn2.addition();
   Print("Line.count=", gLine.count, "  Btn2.m_Line.count=", Btn2.m_Line.count);
   Btn1.addition();
   Print("Line.count=", gLine.count, "  Btn1.m_Line.count=", Btn1.m_Line.count);
   Btn2.addition();
   Print("Line.count=", gLine.count, "  Btn2.m_Line.count=", Btn2.m_Line.count);
  }
//+------------------------------------------------------------------+

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

 
Igor Makanu:

vielleicht sollte es so sein?

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

Ja, Igor, das war's, vielen Dank.

Ich bin immer noch "floundering" in Zeigern, daher Ihre Lösung wird mir helfen, in meiner aktuellen Aufgabe und in das Verständnis, wieman Zeiger zu verwenden.

Wir danken Ihnen für Ihr Feedback.

 
Igor Makanu:

vielleicht sollte es so sein?

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

Und warum verwenden Sie GetPointer(gLine), wenn Sie selbst gLine als Zeiger deklariert haben? )))

Bei der Deklaration muss auch das CLine-Objekt erstellt werden:

CLine* gLine=neue CLine;

Die Schaltfläche und die Zeile müssen ebenfalls in der Phase der Initialisierung der Schaltfläche initialisiert werden.

...
                CMyButton(CLine* line):m_Line(!CheckPointer(line)?NULL:line){};
...
CLine* gLine=new CLine;
CMyButton  Btn1(gLine);
 
Vladimir Simakov:

Warum verwenden Sie GetPointer(gLine), wenn Sie selbst gLine als Zeiger deklariert haben? )))

Die Bildung eines CLine-Objekts ist auch eine dringende Aufgabe, wenn es deklariert wird:

CLine* gLine=neue CLine;

Die Schaltfläche und die Zeile sollten ebenfalls in der Phase der Initialisierung der Schaltfläche initialisiert werden.

Es war nachts, es ist nicht klar, warum ich es so geschrieben habe... Ich habe eigentlich geschlafen, aber Skype auf meinem Handy hat mich geweckt, also habe ich das Forum nur überflogen )))

Und ernsthaft, mein Beispiel ist ein Tutorial, ich habe es nicht überprüft, vielleicht habe ich auf einer unterbewussten Ebene rückversichert, ich verstehe nicht ganz, was ein MQL-Zeiger ist, es funktioniert offensichtlich nicht wie in C++ Zeiger

Ich habe versucht, es herauszufinden, aber ich habe nicht herausfinden, wie Zeiger als Parameter für diehttps://www.mql5.com/ru/forum/1111/page2470#comment_11796309 Funktion arbeiten - ich übergebe einen Zeiger an die Funktion gibt, aber in der Tat bekomme ich eine neue Kopie des Zeigers erstellt

SZY: Ich kann nicht herausfinden, welchen Umfang MQL-Zeiger haben, ich habe auch gefragthttps://www.mql5.com/ru/forum/1111/page2488#comment_12154218.... Ich scheine nicht zu verstehen, welche Fälle einen lokalen und welche einen globalen Anwendungsbereich haben ... Alles in allem, ich arbeite mit MQL-Zeigern nach der wissenschaftlichen Methode (((


Vasiliy Pushkaryov:

Ja, Igor, das war's, vielen Dank.

Ich bin immer noch "schwimmen" in Zeigern, das ist, warum Ihre Lösung wird sehr hilfreich für mich in meiner aktuellen Aufgabe und in weiteres Verständnis für die Verwendung von Zeigern sein.

Wir danken Ihnen für Ihr Feedback.

Bitte! mit MQL-Zeiger nur Praxis wird hier helfen, Sie haben eigentümliche Verhalten, wie@Vladimir Simakov schrieb Ihr Problem ist am ehesten durch das Schreiben eines Konstruktors mit Parameter gelöst werden - ich in der Regel tun so, aus abstrakter Sicht? - Es ist nicht korrekt, aber es ist bequem und funktioniert immer korrekt - und der Compiler lässt Sie nicht vergessen, den Zeiger zu binden.

if(CheckPointer(m_Line)==POINTER_DYNAMIC)

Diese Prüfung kann entfallen, da Sie den Zeiger beim Aufruf des Konstruktors ohnehin speichern.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2019.05.22
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Wow, es stellt sich heraus, dass die Aufgabe nicht darin bestand, darauf zu warten, dass zwei Objekte gleichzeitig einen Zeiger auf eine Zeile übergeben. Es ging eigentlich um die Übergabe eines Zeigers. Wer hätte das gedacht?

Sie brauchen das Objekt nicht mit new zu erstellen, um einen Zeiger irgendwo zu übergeben. Die Klasse, an die der Zeiger übergeben wird, muss jedoch eine Zeigervariable (mit einem Sternchen *) haben.

 
Igor Makanu:

es war nachts, es ist dunkel - deshalb habe ich es so geschrieben... Ich habe eigentlich geschlafen, aber Skype auf meinem Handy hat mich geweckt, so dass ich das Forum nur flüchtig überflogen habe )))

Und ernsthaft, mein Beispiel ist ein Tutorial, ich habe es nicht überprüft, vielleicht habe ich auf einer unterbewussten Ebene rückversichert, ich verstehe nicht ganz, was ein MQL-Zeiger ist, es funktioniert offensichtlich nicht wie in C++ Zeiger

Ich habe versucht, es herauszufinden, aber ich habe nicht herausfinden, wie Zeiger als Parameter für die Funktionhttps://www.mql5.com/ru/forum/1111/page2470#comment_11796309 arbeiten - ich einen Zeiger an die Funktion dort übergeben, aber in der Tat bekomme ich eine neue Kopie des Zeigers erstellt

SZY: Ich kann nicht herausfinden, welchen Umfang MQL-Zeiger haben, ich habe auch gefragthttps://www.mql5.com/ru/forum/1111/page2488#comment_12154218.... Ich scheine nicht zu verstehen, welche Fälle einen lokalen und welche einen globalen Anwendungsbereich haben ... Alles in allem arbeite ich mit MQL-Zeigern nach der Methode des wissenschaftlichen Experiments (((

Im ersten Fall ist alles ganz einfach. Sie erstellen ein neues dynamisches Objekt auf dem Stack, und das ist alles. Sie müssen es in den ...(CObj* &jbj,...

Und im zweiten Fall müssen Sie es tun:

void  AddValue (T &value)  { Tptr  = value; mlist.Add(Tptr);       }
 
Vladimir Simakov:

Im ersten Fall ist es ganz einfach. Sie erstellen ein neues dynamisches Objekt auf dem Stack und das war's. Sie sollten es in die ...(CObj* &jbj,...

Und im zweiten Fall sollten Sie es tun:

Ich werde das heute Abend überprüfen, die Referenz gibt nicht viele Informationen über die Verwendung von &.

Ich danke Ihnen!

 
Der Zeiger kann auch als Nicht-Referenz übergeben werden - ohne &.