Questions sur la POO dans MQL5 - page 41

 
Igor Makanu:

j'ai regardé les résultats de ma bataille avec le code de style POO - hmmm... Excellent ! ))))


J'ai une question, mais dans mon code, enfin, trois fois exactement, j'utilise une construction comme :

appelle tout dans des méthodes privées, mais existe-t-il une "méthode Jedi ?" pour s'affranchir dans le code source de CheckPointer(m_order)==POINTER_INVALID

Je demande à propos de certains get / set

pas de problèmes particuliers, mais pour ainsi dire un caprice, ou alors que la soif de connaissance des méthodes OOP en C++ n'a pas encore diminué

Si la question est "plusieurs lettres", alors !CheckPointer(mPtr), et si l'appel de fonction, vous initialisez tous les pointeurs à NULL dans le constructeur et comparez à celui-ci dans le code, sans oublier lors de la suppression de ptr ; ptr=NULL ;

 
Igor Makanu:

j'ai regardé les résultats de ma bataille avec le code de style POO - hmmm... Excellent ! ))))


J'ai une question, mais dans mon code, enfin, trois fois exactement, j'utilise une construction comme :

appelle tout dans des méthodes privées, mais existe-t-il une "méthode Jedi ?" pour s'affranchir dans le code source de CheckPointer(m_order)==POINTER_INVALID

Je demande à propos de certains get / set

pas de problèmes particuliers, mais pour ainsi dire un caprice, ou alors que la soif de connaissance des méthodes OOP en C++ n'a pas encore diminué


Igor, regardez cet exemple, je pense que c'est ce que vous demandez.

 
Vladimir Simakov:

Si la question est "plusieurs lettres", alors !CheckPointer(mPtr), et si dans un appel de fonction, on initialise tous les pointeurs à NULL dans le constructeur et on compare à celui-ci dans le code, sans oublier lors de la suppression de ptr ; ptr=NULL ;

Eh bien et ça, pour le sucre :

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)
 
Igor Makanu:

Pas de problèmes particuliers, mais pour ainsi dire un coup de tête, ou alors que la soif d'apprendre les méthodes OOP en C++ ne s'est pas encore éteinte.

Je vous recommande vivement d'initialiser tous les champs de la classe avec des valeurs par défaut dans le constructeur. Le fait est que si vous voulez faire ça :

void foo(){
   CClass someClass;
   someClass.DoSomething();
}

personne n'initialisera les champs de votre classe et il y aura des valeurs débiles.

 
Vladimir Simakov:

Et ça, pour le sucre :

Non, j'ai presque abandonné les définitions, je ne veux simplement pas envelopper quoi que ce soit, comme je l'ai écrit il y a quelques semaines - je veux voir du code pur de style OOP pour l'instant, évaluer la flexibilité et les possibilités...

HH : J'ai juste enveloppé les descendants dans define à la création, pour ne pas écrire la même initialisation sur 3 lignes, il est plus facile d'ajouter des méthodes plus tard, c'est-à-dire dans le code source sur une ligne jusqu'à présent

#define  CLASS(NAME,FUNC)....

CLASS(CStrategy01,ReOpenOrder(__FUNCTION__,getDealType()==BUY ? SELL : BUY));
Romain:


Igor, regardez cet exemple, je pense que c'est ce que vous demandez.

non, je veux dire l'équivalent en c# - operator ? ? (opérateur de jonction nulle), quelque chose de similaire en logique que je voudrais voir dans le style C++.


UPD :

Vladimir Simakov:

Je recommande vivement d'initialiser tous les champs d'une classe avec des valeurs par défaut dans le constructeur. Le fait est que si vous voulez faire ça :

Si vous demandez une macro, personne n'initialisera les champs de votre classe et il y aura des valeurs poubelles.

c'est ce que j'ai fait, constructeur avec initialisation de tout et n'importe quoi dans la classe de base, les descendants initialisent la classe de base :

c'est pourquoi je l'ai enveloppé dans une macro, pour ne pas oublier de l'initialiser correctement ))))

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   virtual void NextStepStrategy(void) {FUNC;}}
//____________________________________________________________________
 
Igor Makanu:

Non, j'ai presque abandonné les définitions, je ne veux simplement pas envelopper quoi que ce soit, comme je l'ai écrit il y a quelques semaines - je veux voir du code pur de style OOP pour l'instant, évaluer la flexibilité et les possibilités...

ZS : seulement les descendants enveloppés dans define à la création, pour ne pas écrire la même initialisation sur 3 lignes, c'est plus facile d'ajouter des méthodes plus tard, c'est-à-dire dans le code source sur une seule ligne pour le moment

non, je veux dire l'équivalent en c# - operator ? ? (opérateur de jonction nulle), je veux voir quelque chose de similaire en logique dans le style C++.

Le préprocesseur est une perte de temps. Avec les modèles, ce sont les outils les plus puissants. Il ne semble pas y avoir d'analogue de l'opérateur ? ? Le C++ est plus hardcore à cet égard.
 
Vladimir Simakov:
Votre refus du préprocesseur est vain. Avec les modèles, ce sont les outils les plus puissants. Il ne semble pas y avoir d'analogue de l'opérateur ? ? Le C++ est plus hardcore à cet égard.

Je suis toujours en train de me battre pour un style de POO pur, je veux apprendre toutes les techniques de POO, tant qu'il y a un atout sur le forum ;)

Je connais bien le préprocesseur, mais... Je pense que je ne devrais pas en abuser, en tout cas, ce n'est pas mon style, je risque de me planter, et je ne serai certainement pas capable de lire du code avec de multiples macrosubstitutions, et comment chercher les bugs... eh bien, c'est plus facile à réécrire - donc, pas encore nécessaire


des modèles... Eh bien, je n'aime pas ce que les développeurs proposent dans SB, je les ai tous examinés, il est difficile de dire dans quel but ils ont été inclus dans SB, peut-être que leur temps n'est pas encore arrivé

à propos du portage des templates C++ vers MQL - il est temps, comme la discussion l'a montré, que dans la plupart des cas les templates C++ nécessitent un réglage fin pour MQL - il est plus facile de revenir au .dll et de ne pas s'embêter avec MQL ))))

 
Igor Makanu:

Je suis toujours en train de me battre pour un style de POO pur, je veux apprendre toutes les techniques de POO, tant qu'il y a un atout sur le forum ;)

Je connais bien le préprocesseur, mais... Je pense que je ne devrais pas en abuser, en tout cas, ce n'est pas mon style, je risque de me planter, et je ne serai certainement pas capable de lire du code avec de multiples macrosubstitutions, et comment chercher les bugs... eh bien, c'est plus facile à réécrire - donc, pas encore nécessaire


des modèles... Eh bien, je n'aime pas ce que les développeurs proposent dans SB, je les ai tous examinés, il est difficile de dire dans quel but ils ont été inclus dans SB, peut-être que leur temps n'est pas encore arrivé

à propos du portage des templates C++ vers MQL - il est temps, comme la discussion l'a montré, que dans la plupart des cas les templates C++ nécessitent un réglage fin pour MQL - il est plus facile de revenir au .dll et de ne pas s'embêter avec MQL ))))

Vous pouvez écrire vos propres modèles de cette façon.))
 
Vladimir Simakov:
Vous pouvez écrire des modèles de cette façon vous-même.))))

Yup ))))

J'ai fini de lire l'aide et j'ai sauté l'override, Dieu merci tout est dans les macros, les éditions, enfin, exactement en un copier-coller

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }\
   void NextStepStrategy(void) override {FUNC;}}

UPD :

non, c'est sorti pour le contrôle de permission lui-même, pas besoin de méthode publique !

#define CLASS(NAME,FUNC) class NAME : public CStrategy{\
private:\
void NextStepStrategy(void) override {FUNC;}\
public:\
   NAME(SStrategySettings &set):CStrategy(set){ }}
 
Vladimir Simakov:

Et puis il y a ça, pour le sucre :

#define  DELETE(dObj) do if (dObj!=NULL) {delete dObj; dObj=NULL;} while(false)

Je voulais écrire ce que j'avais l'habitude d'avoir au lieu de...

if( CheckPointer(m_order)==POINTER_INVALID )

c'était comme ça :

if(m_order==NULL)

mais je me suis souvenu comment vérifier les substitutions de macro dans MQL

void OnStart()
{  int a = 0;
#ifdef NULL
   a = 1;
#endif

   Print("a = ",a);
   Print("POINTER_INVALID = ",POINTER_INVALID);
   Print("NULL = ",(int)NULL);   // без (int) не компилируется!!!

}

2019.09.16 22:57:42.837 tst (EURUSD,H1) a = 1

2019.09.16 22:57:42.837 tst (EURUSD,H1) POINTER_INVALID = 0

2019.09.16 22:57:42.837 tst (EURUSD,H1) NULL = 0


et si ma mémoire est bonne, au début de l'année, il était possible de désimprimer NULL dans le journal et d'obtenir 0, maintenant une erreur apparaît.

C'est-à-dire que le comportement NULL as if ne devrait pas changer dans le futur, mais ce qui est substitué là au lieu de NULL n'est pas clair, probablement si cette situation est vérifiée maintenant, comme écritif(CheckPointer(m_order)==POINTER_INVALID)) )) c'est pour ainsi dire le code correct)))

Raison: