Fragen zu OOP in MQL5 - Seite 37

 
Koldun Zloy:

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

Ich verstehe es nicht, deshalb habe ich um Hilfe gebeten. Ich verwende selten Modifikatoren, sondern arbeite eher intuitiv, aber ich möchte immer eine optimale Lösung

Lassen Sie mich das im Code ausprobieren, es sieht so aus

//+------------------------------------------------------------------+
interface IStrategy
{  double      Strategy();
   bool        Finalize(); };
//+------------------------------------------------------------------+
class CStrategy: public IStrategy
{
public:
   bool              GetSaveRequired() { return(CStrategy::f_save_required); CStrategy::f_save_required = false;  }
protected:
   static bool       f_save_required;
   double            ProfitStrategy;
   void              SetSaveRequired() { CStrategy::f_save_required = true;                                       }
   void              RunStrategy();
   virtual void      NextStepStrategy();
   void              EndStrategy();
};

//____________________________________________________________________
void CStrategy::RunStrategy(void)
{  ProfitStrategy = 0.0;
   SetSaveRequired();
//...........    
}
//____________________________________________________________________
void CStrategy::EndStrategy(string func)
{ //...........    
   SetSaveRequired();
}
//____________________________________________________________________
#define CLASS(NAME) class NAME : public CStrategy{\
public:\
   NAME(SSettingsForOrder &set)  { m_setting = set;}\
   ~NAME()                       { delete m_order; }\
   virtual void NextStepStrategy();}
//+------------------------------------------------------------------+
CLASS(CStrategy_XXX);
CLASS(CStrategy_YYY);
CLASS(CStrategy_ZZZ);

void CStrategy_XXX::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_YYY::NextStepStrategy(void) { SetSaveRequired();   //...........     }
void CStrategy_ZZZ::NextStepStrategy(void) { SetSaveRequired();   //...........     }


publicGetSaveRequired() wird in einer Klasse verwendet, um diesen ganzen Zoo von Strategien zu verwalten

mit diesem Muster schreibe ich nur MethodeNextStepStrategy - nur darin ändert sich für TC, alles andere ist gleich, so in der Basisklasse CStrategy sammle ich alle Methoden und alle Felder - sie sind nicht viel

ZS: mit meinem Rücken fühle ich, dass nicht Ass mein Code, aber es wird definitiv funktionieren und wird nicht Duplikate der Variablef_save_required erstellen;

 
Igor Makanu:

Das ist es, was ich nicht verstehe, deshalb habe ich um Hilfe gebeten. Ich verwende selten Modifikatoren, ich verwende sie eher intuitiv, aber wie immer möchte ich die beste Lösung

Lassen Sie mich das im Code ausprobieren, es sieht so aus


publicGetSaveRequired() wird in einer Klasse verwendet, um diesen ganzen Zoo von Strategien zu verwalten

bei diesem Muster schreibe ich nur die MethodeNextStepStrategy - nur darin ändert sich etwas für TC, alles andere ist gleich, und deshalb sammle ichin der Basisklasse CStrategy alle Methoden und alle Felder - es sind nicht viele

ZS: mit meinem Rücken fühle ich, dass nicht Ass mein Code, aber es wird definitiv funktionieren und wird nicht Duplikate der Variablef_save_required erstellen;

Ich würde diese Funktionen ganz entfernen.

Alle Funktionen, die die Struktur nicht verändern, machen sie zu Konstanten.

Alle nicht-konstanten Funktionen sollten das Schreibflag setzen.

Ich würde auch die Funktion Save( int fileHandle ) hinzufügen. Diese Funktion sollte die Struktur schreiben und das Flag zurücksetzen.

Sie können eine statische Funktion erstellen, um den Zustand der Flagge zu ermitteln.

if( CStrategy::GetSaveRequired() )
{
   int fileHandle = FileOpen( ... );
   for( int i = 0; i < 10; i++ )
   {
      strategies[i].Save( fileHandle );
   }
   FileClose( fileHandle );
}
 
Koldun Zloy:

Ich würde diese Funktionen ganz entfernen.

Machen Sie alle Funktionen, die die Struktur nicht verändern, konstant.

Alle nicht-konstanten Funktionen sollten das Schreibflag setzen.

Ich sage Ihnen, ich habe Probleme mit Modifikatoren im Allgemeinen.


SZY: in der Zwischenzeit, was ist im Allgemeinen im Web in der Programmierung Diskussion - hier war ein Artikel über const auf Hobber letzten Monat, die Bedeutung - diese const ist nicht notwendig, schauen Assembler-Code ist nicht anders, ohne const - der Compiler wird es alles wegnehmen ((

 
Igor Makanu:

Ich sage Ihnen, ich habe Probleme mit Modifikatoren im Allgemeinen.

Ich habe gegoogelt und gelesen, irgendetwas ist wieder falsch gelaufen...

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z); 
 }
//+------------------------------------------------------------------+

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

erwartet, dassPrint("const") mindestens einmal erscheint;
 
Igor Makanu:

Gegoogelt, gelesen, wieder etwas falsch gemacht...

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

2019.09.13 21:10:54.316 tst (EURUSD,H1) x = v

erwartet, dassPrint("const") mindestens einmal erscheint;
class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  void f(const int v) { x = v; Print("(const) x = v ");  }
//  void f(int v)       { x = v; Print("x = v ");          } // 'f' - function already defined and has body     
};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }
Dies ist eine Überladung für eine konstante Klasse.
 
Vladimir Simakov:
Dies ist eine Überladung für eine konstante Klasse.

Hmmm... stimmt, ich habe fast eine halbe Stunde damit verbracht, sowohl den Hub als auch die Foren zu lesen, aber ich konnte den Dreh nicht rauskriegen.

Danke! Jetzt habe ich es.

Es besteht immer noch der Verdacht eines solchen Beispiels:

class A {
private:
  int x;
public:
  void f(int v) const { Print("const");                  }
  const void f(int v) { x = v; Print("(const) x = v ");  }

};

A a;
const A b;
//+------------------------------------------------------------------+
void OnStart()
{ 
   int y       = 1;
   const int z = 2;
   a.f(3);
   a.f(y);
   a.f(z);
   b.f(3);
   b.f(y);
   b.f(z);
 }

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) (const) x = v

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const

2019.09.13 22:04:34.295 tst (EURUSD,H1) const


die gleichen Werte angegeben haben, aber der Punkt ist ganz anders? - Dann brauchen Sie wieder die Hilfe der Halle.
 
Ich sitze gerade in einer Vorlesung über OOP. Vielleicht kann ich etwas Nützliches mit Ihnen teilen )).
Ich kann die aktuelle Vorlesung herunterladen. Soweit natürlich die trivialen Dinge.
 
Nikolai Semko:
Ich besuche zur Zeit eine Vorlesung über OOP. (Vielleicht teile ich mit, was ich lerne))
Ich kann die aktuelle Vorlesung herunterladen. Soweit natürlich die trivialen Dinge.

Nun, Ihr Vortrag ist höchstwahrscheinlich in Kauderwelsch, während Sie hier kaum etwas auf Russisch lernen können, Sie haben das Internet zum dritten Mal durchforstet... die Gesamtsituation ist düster wie hier auf dem Forum, echte Programmierer - nicht mehr als 10 Personen auf Ressourcen, der Rest sind Geeks

Ok, die Gesamtsituation hat sich mit const geklärt, ich habe mit dem Rest der Modifikatoren gearbeitet, also habe ich eine Menge Theorie ... Ich muss es anwenden, aber ich fühle mich wie ein Student )))

 
Igor Makanu:

Nun, Ihr Vortrag ist höchstwahrscheinlich in Kauderwelsch, während Sie hier kaum etwas auf Russisch lernen können, Sie haben sich zum dritten Mal im Internet umgesehen... die Gesamtsituation ist ähnlich wie hier im Forum, es gibt nicht mehr als 10 echte Programmierer und der Rest sind Geeks

Ok, die Gesamtsituation hat sich mit const geklärt, ich habe mit dem Rest der Modifikatoren gearbeitet, also habe ich genug Theorie... Ich fühle mich wie ein Student ))).

Ja, auch ich habe eine ähnliche Situation. Lernen ist nicht schwer, schwieriger ist es, umzulernen und alte Gewohnheiten abzulegen. Ich kann mir viele schlechte Gewohnheiten der prozeduralen Programmierung immer noch nicht abgewöhnen.

 
Igor Makanu:

Ich hätte gerne ein Beispiel, ich sage Ihnen, ich bin überhaupt nicht gut mit Modifikatoren.


SZY: darüber hinaus im Allgemeinen der Horror, was im Web in der Programmierdiskussion los ist - hier war ein Artikel über const auf hobber letzten Monat, die Bedeutung - ja, diese const ist nicht notwendig, siehe Assembler-Code unterscheidet sich nicht, dass ohne const - der Compiler wird alles entfernen (((

Sie können die Konstanten und die Statik für den Moment einfach vergessen. Auch an den Schnittstellen.

Und wenn alles fertig ist, dann schauen Sie und markieren Sie etwas als Statik und etwas als Konstante. Und Sie können die Schnittstellen ganz vergessen.

Grund der Beschwerde: