Fragen zu OOP in MQL5 - Seite 36

 
Igor Makanu:

Nun ja, das ist eine bessere Lösung! damit es eine Methode weniger gibt

In OnStart sollte es nur einen neuen Eintrag geben.
 
Koldun Zloy:

1. Es ist nicht schlimm, diese Funktion zweimal aufzurufen.

2. stört es Sie nicht, dass diejenigen, die gegen die Verwendung statischer Funktionen sind, nicht das geringste Argument anführen?

Schauen Sie sich besser nicht einfach Videos von irgendjemandem an, sondern lesen Sie Bücher.

Ich wünsche dem Autor der Videos https://youtu.be/lfdAwl3-X_c und https://youtu.be/zME4SOCHT0I viele gute Dinge..... die ganze Woche ausgeknockt, alles, was ich mich hinsetze, fange ich an zu denken, nicht zu tun wie vorher .... Sie können keine Statik verwenden, das ist kein OOP!

Ich möchte den Code fertigstellen, aber ich habe eine Frage:

- Ich möchte Felder von Objekten speichern, gut, dass die Felder sofort in den Strukturen platziert wurden, und Sie können sie mit einem einzigen Klick über FileWriteStruct() speichern

- es gibt N Objekte einer Klasse, die alle von einer Basisklasse geerbt haben

- weil ich das Video gesehen habe, habe ich gehofft, dass irgendeine Methode mir helfen würde, nicht jedes Objekt abzufragen, ob es die Datei speichern muss.... Im allgemeinen Fiasko wurde beschlossen, nicht dumm zu sein und eine Methode zu erstellen, die statisch ein Flag zum Schreiben in die Datei zuweisen wird

class CStrategy: public IStrategy
{
protected:
static bool       f_save_required;
void              SetSaveRequired()        { CStrategy::f_save_required = true;                    }
public:
bool              GetSaveRequired()        { return(CStrategy::f_save_required);                   }

Es funktioniert wie geplant

Und die Frage selbst, was passieren wird, wenn man es so schreibt:

class CStrategy: public IStrategy
{
private:
static bool       f_save_required;
protected:
void              SetSaveRequired()        { CStrategy::f_save_required = true;                    }
public:
bool              GetSaveRequired()        { return(CStrategy::f_save_required);                   }

was passieren wird, wenn Sie es so schreiben:

class CStrategy: public IStrategy
{
private:
static bool       f_save_required;
protected:
void              SetSaveRequired()        { f_save_required = true                   }
public:
bool              GetSaveRequired()        { return(f_save_required);                   }
 

versucht, verschiedene Möglichkeiten, das Testskript zu ändern, kann ich keinen Unterschied sehen, zeigen Sie mir die richtigen Modifikatoren für den Beitrag oben: (geschützt / privat ) und rufen M::x oder nur x

//+------------------------------------------------------------------+
interface I
{  bool main();

};
//+------------------------------------------------------------------+
class M:public I
{
protected:
static int        x;
bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }
public:
                     M()      { Print(__FUNCTION__);}
                    ~M()      { Print(__FUNCTION__);}
};
//+------------------------------------------------------------------+

static int M::x=0;
//+------------------------------------------------------------------+
class A:public M
{
public:
                     A()      { Print(__FUNCTION__);}
                    ~A()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+
class B:public M
{
public:
                     B()      { Print(__FUNCTION__);}
                    ~B()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+
class C:public M
{
public:
                     C()      { Print(__FUNCTION__);}
                    ~C()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+

void OnStart()
{  I *a = new A;
   I *b = new B;
   I *c = new C;
   I *m = new M;

   a.main();
   b.main();
   c.main();
   m.main();


   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+
 
Igor Makanu:

versucht, verschiedene Möglichkeiten, um das Testskript zu ändern, sehe ich keinen Unterschied, zeigen Sie mir die richtigen Modifikatoren für den Beitrag oben: (geschützt / privat ) und rufen M::x oder nur x

Innerhalb von Klassenmethoden rufen Sie x auf, an allen anderen Stellen M::x. Wenn geschützt, dann ist der Bezug nur in Methoden der Klasse möglich, in der das Feld definiert ist, hier ist die Logik gemeinsam.
 
Übrigens: Frohe Feiertage. Ein weiteres Byte ist passiert.
 
Vladimir Simakov:
Innerhalb von Klassenmethoden rufen Sie x auf, an allen anderen Stellen M::x, wenn geschützt, dann ist der Zugriff nur in Methoden der Klasse möglich, in der das Feld definiert ist, hier ist die Logik gemeinsam.

Richtig, ich habe im Schlaf ein falsches Beispiel gemacht, deshalb habe ich 'M::main' - cannot access private member function:

class M
{
private:
   static int        x;
   bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }
public:
                     M()      { Print(__FUNCTION__);}
                    ~M()      { Print(__FUNCTION__);} };
//+------------------------------------------------------------------+

static int M::x=0;
//+------------------------------------------------------------------+
class A:public M
{
public:
                     A()      { Print(__FUNCTION__);}
                    ~A()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
class B:public M
{
public:
                     B()      { Print(__FUNCTION__);}
                    ~B()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
class C:public M
{
public:
                     C()      { Print(__FUNCTION__);}
                    ~C()      { Print(__FUNCTION__);}
   void                inc()     {main();} };
//+------------------------------------------------------------------+
void OnStart()
{  A *a = new A;
   B *b = new B;
   C *c = new C;
   M *m = new M;

   a.inc();



   delete a;
   delete b;
   delete c;
   delete m;

}
//+------------------------------------------------------------------+

got 'M::main' - cannot access private member function tst.mq5 25 32

Wenn ich es aufschreibe

protected:   
   bool              main()   { x++;  Print(__FUNCTION__," = ",x); return(x>0); }

alles funktioniert wie geplant!

 
Vladimir Simakov:
Übrigens: Frohe Feiertage. Ein weiteres Byte ist passiert.

Danke, das ist erledigt!

Schöne Feiertage!

 
Igor Makanu:

Ich wünsche dem Autor der Videos https://youtu.be/lfdAwl3-X_c und https://youtu.be/zME4SOCHT0I viel Gutes ..... die ganze Woche über, alles, was ich mir vornehme, fange ich an zu denken, anstatt es zu tun wie bisher .... Sie können keine Statik verwenden, das ist kein OOP!

Ich möchte den Code fertigstellen, aber ich habe eine Frage:

- Ich möchte Felder von Objekten speichern, gut, dass die Felder sofort in den Strukturen platziert wurden, und Sie können sie mit einem einzigen Klick über FileWriteStruct() speichern

- es gibt N Objekte einer Klasse, die alle von einer Basisklasse geerbt haben

- weil ich das Video gesehen habe, habe ich gehofft, dass irgendeine Methode mir helfen würde, nicht jedes Objekt abzufragen, ob es die Datei speichern muss.... Im allgemeinen Fiasko wurde beschlossen, nicht dumm zu sein und eine Methode zu erstellen, die statisch ein Flag zum Schreiben in die Datei zuweisen wird

Es funktioniert wie geplant

Und die Frage selbst, was passieren wird, wenn man es so schreibt:

was passiert, wenn man es so schreibt:

Wovon hängt es ab, ob ein Objekt in einer Datei gespeichert werden muss?

Ist dieses Kennzeichen für alle Objekte gleich?

 
Koldun Zloy:

Wovon hängt es ab, ob das Objekt in einer Datei gespeichert wird?

Ist dies eine Eigenschaft, die allen Objekten gemeinsam ist?

Nun, die Frage ist natürlich dialektisch, hier

- Es ist besser, 10 Strategien zu haben und 10 Dateien mit Zustandsänderungen von TC zu schreiben (1 TC = 1 Struktur)

- oder es ist logischer, ein Handle von der Klasse zu übergeben, wo es einen Aufruf (Suche) von Strategien pro Tick gibt, so dass sie alle in eine Datei schreiben

Ich denke, die 2. Variante ist logischer


es stellt sich heraus, dass man nach dem Start aller TCs einmal 10 Strukturen schreiben muss - der Zustand hat sich geändert

dann in zufälliger Reihenfolge müssen sie schreiben, wenn sie gebraucht werden (Auslösung von SL oder TP) - hier ist es auch schneller , die Datei zu öffnen und 10 Strukturen in einem Rutsch zu schreiben, Strategien sind nicht pipswise, nicht jede Sekunde, von einer Minute bis zu einer Stunde in jedem TS


Bisher habe ich eine Beschreibung einer statischen Variable und den Zugriff auf sie durch ein get - set, set protected, get public implementiert - es setzt auch die statische Variable nach dem Aufruf auf false zurück

 
Igor Makanu:

Nun, die Frage ist natürlich dialektisch, hier

- Sie haben entweder 10 Strategien und schreiben 10 Dateien mit Zustandsänderung von TC (1 TC = 1 Struktur)

- oder es ist logischer, ein Handle von der Klasse zu übergeben, in der ein Aufruf (Suche) von Strategien auf einen Tick erfolgt, so dass sie alle in eine Datei schreiben

Ich denke, die 2. Variante ist logischer


es stellt sich heraus, dass man nach dem Start aller TCs einmal 10 Strukturen schreiben muss - der Zustand hat sich geändert

dann in zufälliger Reihenfolge müssen sie schreiben, wenn sie gebraucht werden (Auslösung von SL oder TP) - hier ist es auch schneller , die Datei zu öffnen und 10 Strukturen in einem Rutsch zu schreiben, Strategien sind nicht pipswise, nicht jede Sekunde, von einer Minute bis zu einer Stunde in jedem TS


Für jetzt habe ich durch die Beschreibung einer statischen Variable Zugriff auf sie durch ein Get, Set Protected, Get public - es auch auf false die statische Variable zurückgesetzt, nachdem es aufgerufen wurde implementiert

Das ist alles klar. Es ist nicht klar, warumSetSaveRequired() undGetSaveRequired() nicht statisch sind, aber in eine statische Variable schreiben.

Grund der Beschwerde: