Questions sur la POO dans MQL5 - page 19

 
Vladimir Simakov:
Je pars du principe qu'il n'y aura pas de lot, par exemple 0,15. En tout cas, je n'en ai pas entendu parler. Si je le fais, je le changerai.

Je sais que c'est peu probable, mais vous voulez toujours la solution parfaite ))))

Ce n'est pas le plus gros problème, mais je me suis créé un problème... Je voulais un OOP parfait, mais sans appels inutiles et tout était optimal.

Je veux avoir 5 instances de la classe, mais je dois initialiser les champs de la classe une seule fois - ils contiennent l'environnement du terminal, qui ne changera pas pendant l'exécution du programme.

string         Language;

Si je déclare static string Language ; - alors il y aura une erreur de variable statique non résolue 'A::Language'.

voici un exemple

//+------------------------------------------------------------------+
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);
  }

Je vais initialiser la chaîne Language 5 fois dans ce formulaire - c'est faux et cela ne compilera pas avec les modificateurs statiques.

et il n'est pas nécessaire d'avoir 5 copies de la variable linguistique ! - j'ai essayé dans la classe B de déclarer une instance de la classe - même chose 5 Les variables de langue ont

2019.08.29 12:44:58.384 tst__ EURUSD,M15 : initialisé

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 reason 3

 
Igor Makanu:

Je sais que c'est peu probable, mais vous voulez toujours la solution parfaite ))))

Ok, ce n'est pas le plus gros problème, mais je me suis créé un problème... Je voulais un OOP parfait, mais sans appels inutiles et tout était optimal.

Je veux avoir 5 instances de la classe, mais je dois initialiser les champs de la classe une seule fois - ils contiennent l'environnement du terminal, qui ne changera pas pendant l'exécution du programme.

Si je déclare static string Language ; - alors il y aura une erreur de variable statique non résolue 'A::Language'.

voici un exemple

Je vais initialiser la chaîne Language 5 fois dans ce formulaire - ce n'est pas correct, et cela ne compile pas avec les modificateurs statiques

2019.08.29 12:44:58.384 tst__ EURUSD,M15 : initialisé

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 reason 3

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

OK, c'est une option

Mais je veux tout regrouper dans une seule classe - dans mon exemple, j'ai la classe B et je veux 5 instances de B, mais je ne veux pas initialiserLanguage 5 foiset donc je ne veux pas avoir une variableLanguage dans chaque instance.

Comment se débarrasser de lalangue supplémentaire?

 
Igor Makanu:

OK, c'est une option

Mais je veux tout regrouper dans une seule classe - dans mon exemple, j'ai la classe B et je veux 5 instances de B, mais je ne veux pas initialiser Language 5 fois et donc je ne veux pas avoir une variableLanguage dans chaque instance.

Comment se débarrasser du surplus delangue ?

Hériter. De cette façon, il ne sera initialisé qu'une seule fois.

 
Igor Makanu:

Je sais que c'est peu probable, mais on veut toujours la solution parfaite ))))

Ok, ce n'est pas le plus gros problème, mais je me suis créé un problème... Je voulais un OOP parfait, mais sans appels inutiles et tout était optimal.

Je veux avoir 5 instances de la classe, mais je dois initialiser les champs de la classe une seule fois - ils contiennent l'environnement du terminal, qui ne changera pas pendant l'exécution du programme.

Si je déclare static string Language ; - alors il y aura une erreur de variable statique non résolue 'A::Language'.

voici un exemple

Je vais initialiser la chaîne Language 5 fois dans ce formulaire - c'est faux et cela ne compilera pas avec les modificateurs statiques.

et il n'est pas nécessaire d'avoir 5 copies de la variable linguistique ! - j'ai essayé dans la classe B de déclarer une instance de la classe - même chose 5 Les variables de langue ont

2019.08.29 12:44:58.384 tst__ EURUSD,M15 : initialisé

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 reason 3

Je suis sur mon téléphone en ce moment. Rappelle-moi ce soir et je te montrerai comment le résoudre.
 
Andrey Barinov:

Hériter. Sous cette forme, il ne sera initialisé qu'une seule fois.

Cela fonctionne pour moi

//+------------------------------------------------------------------+
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 : initialisé

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


au moins monTerminalInfoString() est appelé une fois


Donc, j'ai en quelque sorte un Singleton

Merci !

 
Vladimir Simakov:
Je suis sur mon téléphone en ce moment. Rappelle-moi dans la soirée et je te montrerai comment le résoudre.

OK, si ça ne vous dérange pas trop.

et le thème du Singleton est assez nouveau pour moi, il y a de la place pour la créativité - des exemples seraient

 
Igor Makanu:

OK, si ça ne vous dérange pas trop.

et le thème du Singleton est assez nouveau pour moi, il y a de la place pour la créativité - des exemples seraient

Alors, voulez-vous un singleton, ou un champ général pour les objets ?
 
Vladimir Simakov:
Alors, avez-vous besoin d'un champ commun pour les objets ?

c'est difficile de dire ce que je veux ))))

Laissez-moi essayer de l'exprimer en mots :

- Je veux une classe qui est initialisée par le constructeur et cette classe n'aura pas de méthodes ; le but de la classe est d'ouvrir un ordre et ensuite de fermer et/ou rouvrir plusieurs autres ordres selon un script ; le type de script est une énumération.

- Je vais utiliser un tableau d'instances de la classe - au moins 5

- Je ne veux pas ouvrir l'ordre sans appeler l'environnement terminal à chaque fois. Par conséquent, je veux utiliser SYMBOL_VOLUME_MAX, Symbol, SYMBOL_VOLUME_MIN et le nombre de chiffres dans SYMBOL_VOLUME_STEP comme valeurs constantes dans la classe

- Je veux une utilisation optimale des variables, c'est-à-dire que je ne veux pas faire double emploi avec les constantes du paragraphe précédent.


C'est à peu près la façon dont je vois tout cela, mais en général, le problème est maintenant réduit à la structure correcte de la classe elle-même, comme il s'est avéré déjà avoir à hériter, de sorte que SYMBOL_VOLUME_MAX , Symbol,SYMBOL_VOLUME_MIN ... pour n'avoir qu'une seule copie, je pense que je vais encore buter sur la sortie d'erreur, je vais utiliser quelque chose comme ceci à partir de mon PrintLastError.mqhhttps://www.mql5.com/ru/code/24829#

 
Une variable statique, même sans héritage, sera la même pour toutes les instances.
Raison: