Fragen zu OOP in MQL5 - Seite 19

 
Vladimir Simakov:
Ich gehe davon aus, dass es kein Los geben wird, zum Beispiel 0,15. Zumindest habe ich nichts davon gehört. Wenn ich das tue, werde ich es ändern.

Ich weiß, es ist unwahrscheinlich, aber man will immer die perfekte Lösung ))))

Ok, es ist nicht das größte Problem, aber ich habe mir ein Problem geschaffen... Ich wollte ein perfektes OOP, aber ohne unnötige Aufrufe und alles war optimal

Ich möchte 5 Instanzen der Klasse haben, aber ich muss die Klassenfelder einmal initialisieren - sie enthalten die Terminalumgebung, die sich während der Ausführung des Programms nicht ändern wird.

string         Language;

Wenn ich static string Language deklariere; - dann gibt es einen Fehler unresolved static variable 'A::Language'

Hier ist ein Beispiel

//+------------------------------------------------------------------+
class A
  {
public:
   string         Language;
                     A() { Print(__FUNCTION__); Language = TerminalInfoString(TERMINAL_LANGUAGE); }

  };
//+------------------------------------------------------------------+
class B:public A
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

Ich werde String Language 5 Mal in dieser Form initialisieren - es ist falsch und es wird nicht mit statischen Modifikatoren kompilieren

und es ist nicht nötig, 5 Kopien der Sprachvariablen zu haben! - versucht, in der Klasse B eine Instanz der Klasse zu deklarieren - dasselbe, 5 Sprachvariablen haben

2019.08.29 12:44:58.384 tst__ EURUSD,M15: initialisiert

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit Grund 3

 
Igor Makanu:

Ich weiß, es ist unwahrscheinlich, aber man will immer die perfekte Lösung ))))

Ok, es ist nicht das größte Problem, aber ich habe mir ein Problem geschaffen... Ich wollte ein perfektes OOP, aber ohne unnötige Aufrufe und alles war optimal

Ich möchte 5 Instanzen der Klasse haben, aber ich muss die Klassenfelder einmal initialisieren - sie enthalten die Terminalumgebung, die sich während der Ausführung des Programms nicht ändern wird.

Wenn ich static string Language deklariere; - dann gibt es einen Fehler unresolved static variable 'A::Language'

Hier ist ein Beispiel

Ich werde String Language 5 Mal in dieser Form initialisieren - es ist falsch, und es kompiliert nicht mit statischen Modifikatoren

2019.08.29 12:44:58.384 tst__ EURUSD,M15: initialisiert

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit Grund 3

class Test
  {
private:
   static const string Language;
public:
                     Test(void){}
                    ~Test(void){}
  };
static const string Test::Language=::TerminalInfoString(TERMINAL_LANGUAGE);
 
Andrey Barinov:

OK, das ist eine Option

Aber ich möchte alles in einer Klasse verpacken - in meinem Beispiel habe ich Klasse B und ich möchte 5 Instanzen von B, aber ich möchteSprache nicht 5 Mal initialisierenund daher möchte ich nichtin jeder Instanzeine VariableSprachehaben

Wie werde ich die zusätzlicheSprache los?

 
Igor Makanu:

OK, das ist eine Option

Aber ich möchte alles in einer Klasse verpacken - in meinem Beispiel habe ich Klasse B und ich möchte 5 Instanzen von B, aber ich möchte Sprache nicht 5 Mal initialisieren und daher möchte ich nichtin jeder Instanz eine VariableSprache haben

Wie werde ich die zusätzlicheSprache los?

Vererben. Auf diese Weise wird sie nur einmal initialisiert.

 
Igor Makanu:

Ich weiß, es ist unwahrscheinlich, aber man will immer die perfekte Lösung ))))

Ok, es ist nicht das größte Problem, aber ich habe mir ein Problem geschaffen... Ich wollte ein perfektes OOP, aber ohne unnötige Aufrufe und alles war optimal

Ich möchte 5 Instanzen der Klasse haben, aber ich muss die Klassenfelder einmal initialisieren - sie enthalten die Terminalumgebung, die sich während der Ausführung des Programms nicht ändern wird.

Wenn ich static string Language deklariere; - dann gibt es einen Fehler unresolved static variable 'A::Language'

Hier ist ein Beispiel

Ich werde String Language 5 Mal in dieser Form initialisieren - es ist falsch und es wird nicht mit statischen Modifikatoren kompilieren

und es ist nicht nötig, 5 Kopien der Sprachvariablen zu haben! - versucht, in der Klasse B eine Instanz der Klasse zu deklarieren - dasselbe, 5 Sprachvariablen haben

2019.08.29 12:44:58.384 tst__ EURUSD,M15: initialisiert

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit Grund 3

Ich bin gerade an meinem Telefon. Erinnern Sie mich heute Abend daran, und ich zeige Ihnen, wie Sie das Problem lösen können.
 
Andrey Barinov:

Vererben. In dieser Form wird er nur einmal initialisiert.

Funktioniert bei mir

//+------------------------------------------------------------------+
string MyTerminalInfoString()
  {
   Print(__FUNCTION__);
   return("ru");
  }
//+------------------------------------------------------------------+
class CLang
  {
protected:
   static const string Language;
public:
                     CLang(void) {Print(__FUNCTION__);}
                    ~CLang(void) {}
  };
//+------------------------------------------------------------------+
static const string CLang::Language=MyTerminalInfoString();
//+------------------------------------------------------------------+
class B:public CLang
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

2019.08.29 13:24:19.690 tst__ EURUSD,M15: initialisiert

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: MyTerminalInfoString


mindestens einmal wird myTerminalInfoString() aufgerufen


Ich habe also eine Art Singleton

Ich danke Ihnen!

 
Vladimir Simakov:
Ich bin gerade an meinem Telefon. Erinnern Sie mich abends daran, und ich zeige Ihnen, wie Sie das Problem lösen können.

OK, wenn es nicht zu viel Mühe macht.

und das Singleton-Thema ist ziemlich neu für mich, es gibt Raum für Kreativität - Beispiele wären

 
Igor Makanu:

OK, wenn es nicht zu viel Mühe macht.

und das Singleton-Thema ist ziemlich neu für mich, es gibt Raum für Kreativität - Beispiele wären

Wollen Sie also ein Singleton oder ein allgemeines Feld für Objekte?
 
Vladimir Simakov:
Brauchen Sie also ein gemeinsames Feld für die Objekte?

es ist schwer zu sagen, was ich will ))))

Lassen Sie mich versuchen, es in Worte zu fassen:

- Ich möchte eine Klasse, die durch den Konstruktor initialisiert wird, und diese Klasse wird keine Methoden haben; der Zweck der Klasse ist es, eine Bestellung zu öffnen und dann zu schließen und/oder mehrere weitere Bestellungen gemäß einem Skript wieder zu öffnen; der Skripttyp ist eine Aufzählung

- Ich werde eine Reihe von Instanzen der Klasse verwenden - mindestens 5

- Ich möchte den Auftrag nicht öffnen, ohne jedes Mal die Terminalumgebung aufzurufen. Daher möchte ich SYMBOL_VOLUME_MAX, Symbol, SYMBOL_VOLUME_MIN und die Anzahl der Ziffern in SYMBOL_VOLUME_STEP als konstante Werte in der Klasse

- Ich möchte die Variablen optimal nutzen, d. h. ich möchte die Konstanten im vorherigen Absatz nicht duplizieren.


Das ist ungefähr, wie ich es sehe, aber im Allgemeinen ist das Problem jetzt auf die korrekte Struktur der Klasse selbst reduziert, wie es sich herausstellte bereits zu erben, so dass SYMBOL_VOLUME_MAX , Symbol,SYMBOL_VOLUME_MIN ... um ein Exemplar zu haben, denke ich, dass ich immer noch über die Fehlerausgabe stolpern werde, ich werde etwas wie dieses aus meiner PrintLastError.mqhhttps://www.mql5.com/ru/code/24829# verwenden

 
Eine statische Variable ist, auch ohne Vererbung, für alle Instanzen die gleiche.