Questions sur la POO dans MQL5 - page 36

 
Igor Makanu:

Eh bien oui, c'est une meilleure solution ! pour qu'il y ait une méthode de moins

Il ne devrait y avoir qu'une seule nouvelle dans OnStart.
 
Koldun Zloy:

1. Il n'y a rien de mal à appeler cette fonction deux fois.

2. ne trouvez-vous pas que ceux qui sont contre l'utilisation des fonctions statiques ne donnent pas le moindre argument ?

Il vaut mieux ne pas regarder les vidéos de n'importe qui mais lire des livres.

Je souhaite à l'auteur des vidéos https://youtu.be/lfdAwl3-X_c et https://youtu.be/zME4SOCHT0I beaucoup de bonnes choses..... assommé toute la semaine, tout ce que je m'assois pour faire je commence à réfléchir, pas à faire comme avant ..... vous ne pouvez pas utiliser les statiques, ce n'est pas de la POO !

Je veux finir le code, j'ai une question :

- Je veux sauvegarder les champs des objets, bonne chose, les champs ont été immédiatement placés dans les structures, et vous pouvez les sauvegarder d'un simple clic via FileWriteStruct()

- il y a N objets d'une même classe, tous hérités d'une classe de base

- parce que j'ai regardé la vidéo, j'espérais qu'une méthode m'aiderait à ne pas interroger chaque objet s'il avait besoin de sauvegarder le fichier..... Dans ce fiasco général, il a été décidé de ne pas être stupide et de créer une méthode qui assignera statiquement un drapeau pour écrire dans le fichier

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

Il fonctionne comme prévu

Et la question elle-même, que se passera-t-il si vous l'écrivez de cette façon :

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

ce qui se passera si vous l'écrivez de cette façon :

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

J'ai essayé différentes façons de modifier le script de test, je ne vois pas de différence, montrez-moi les modificateurs corrects pour le post ci-dessus : (protected / private ) et appeler M::x ou juste 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:

J'ai essayé différentes façons de modifier le script de test, je ne vois aucune différence, montrez-moi les modificateurs corrects pour le post ci-dessus : (protégé / privé ) et appeler M::x ou juste x

Dans les méthodes de la classe, vous appelez x, dans tous les autres endroits M::x. Si elle est protégée, alors la référence n'est possible que dans les méthodes de la classe dans laquelle le champ est défini, ici la logique est commune.
 
Bonne fête, au fait. Un autre octet s'est produit.
 
Vladimir Simakov:
Dans les méthodes de la classe, vous appelez x, dans tous les autres endroits M::x, s'il est protégé, alors l'accès n'est possible que dans les méthodes de la classe dans laquelle le champ est défini, ici la logique est commune.

C'est vrai ! J'ai fait un mauvais exemple dans mon sommeil, et j'ai obtenu '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

Si je l'écris

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

tout fonctionne comme prévu !

 
Vladimir Simakov:
Bonne fête, au fait. Un autre octet est arrivé.

Merci, c'est réglé !

Joyeuses fêtes !

 
Igor Makanu:

Je souhaite à l'auteur des vidéos https://youtu.be/lfdAwl3-X_c et https://youtu.be/zME4SOCHT0I beaucoup de bonnes choses ..... assommé toute la semaine, tout ce que je m'assois pour faire je commence à réfléchir plutôt que de faire comme avant ..... vous ne pouvez pas utiliser les statiques, ce n'est pas de la POO !

Je veux finir le code, j'ai une question :

- Je veux sauvegarder les champs des objets, bonne chose, les champs ont été immédiatement placés dans les structures, et vous pouvez les sauvegarder d'un simple clic via FileWriteStruct()

- il y a N objets d'une même classe, tous hérités d'une classe de base

- parce que j'ai regardé la vidéo, j'espérais qu'une méthode m'aiderait à ne pas interroger chaque objet s'il avait besoin de sauvegarder le fichier..... Dans ce fiasco général, il a été décidé de ne pas être stupide et de créer une méthode qui assignera statiquement un drapeau pour écrire dans le fichier

Il fonctionne comme prévu

Et la question elle-même, que se passera-t-il si vous l'écrivez de cette façon :

ce qui se passe si vous l'écrivez de cette façon :

De quoi dépend le fait qu'un objet doive être enregistré dans un fichier ?

Ce drapeau est-il commun à tous les objets ?

 
Koldun Zloy:

De quoi dépend la sauvegarde de l'objet dans un fichier ?

S'agit-il d'une caractéristique commune à tous les objets ?

Eh bien, la question est dialectique, bien sûr, ici...

- Il est préférable d'avoir 10 stratégies et d'écrire 10 fichiers avec changement d'état des CT (1 CT = 1 structure).

- ou bien il est plus logique de passer un handle de la classe, où il y a un appel (recherche) de stratégies par tick, de sorte qu'elles écrivent toutes dans un seul fichier.

Je pense que la 2ème variante est plus logique


il s'avère qu'après le début de tous les CTs vous devez écrire 10 structures une fois - l'état a changé

ensuite, dans un ordre aléatoire, ils doivent écrire quand c'est nécessaire (déclenchement de SL ou TP) - ici, il est également plus rapide d'ouvrir le fichier et d'écrire 10 structures en une seule fois, les stratégies ne sont pas à la minute, pas toutes les secondes, d'une minute à une heure dans chaque TS.


Jusqu'à présent, j'ai implémenté la description d'une variable statique et l'accès à celle-ci par le biais d'un get - set, set protected, get public - il remet également la variable statique à false après l'appel.

 
Igor Makanu:

Eh bien, la question est dialectique, bien sûr, ici...

- Vous avez soit 10 stratégies et écrivez 10 fichiers avec changement d'état de TC (1 TC = 1 structure)

- ou il est plus logique de passer un handle de la classe, où il y a un appel (recherche) de stratégies sur un tick, ainsi ils écrivent tous dans un fichier.

Je pense que la 2ème variante est plus logique


il s'avère qu'après le début de tous les CTs vous devez écrire 10 structures une fois - l'état a changé

ensuite, dans un ordre aléatoire, ils doivent écrire quand c'est nécessaire (déclenchement du SL ou du TP) - ici, il est également plus rapide d'ouvrir le fichier et d'écrire 10 structures en une seule fois, les stratégies ne sont pas à la minute, pas toutes les secondes, d'une minute à une heure dans chaque TS.


Pour l'instant, j'ai implémenté une description d'une variable statique à laquelle on accède via get - set, set protected, get public - cela remet également la variable statique à false après qu'elle ait été appelée.

Tout est clair. Il n'est pas clair pourquoiSetSaveRequired() etGetSaveRequired() sont non-statiques mais écrivent dans une variable statique.