Questions sur la POO dans MQL5 - page 84

 
Pavel Verveyko:
Est-il possible de déclarer un tableau statique dans une section de classe publique et de l'initialiser dans le constructeur ? (comme ci-dessous) (ou seulement élément par élément ?)

vous pouvez

ou peut-être cherchez-vous une initialisation de tableau statique après tout ?

class A
{
public:
   static bool Mass[5];
               A() { ArrayPrint(Mass); }
};

static bool A::Mass[5] = { false, true, false, true, true };
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
}
//+------------------------------------------------------------------+
 
Pavel Verveyko:
Un tableau statique peut-il être déclaré dans la section publique de la classe et initialisé dans le constructeur ? (comme ci-dessous) (ou seulement élément par élément ?)

Ça donne quelque chose comme ça :

class A{
   protected:
      static int x[];
      int my[];
   public:
      A(){
         ArrayCopy(my,x);
      }   
};

int A::x[]={1,2,3,4,5};

A a;
En général, cette pauvreté de la POO est frappante dans le contexte de sa brillance. Pourquoi ne pouvons-nous pas initialiser les variables et les tableaux comme d'habitude lors de leur déclaration ? Je ne doute pas que les théoriciens vont maintenant proposer un grand nombre de théories prouvant que je suis un idiot, mais quand même...
 
Sergey Dzyublik:

Vous pouvez initialiser un tableau local et effectuer ArrayCopy vers le champ de tableau approprié :

C'était aussi une idée, il peut être placé dans la portée globale en dehors de toute classe également.
C'est encore plus facile, mais je voulais que ce soit OOP))

 
Dmitry Fedoseev:

Ça donne quelque chose comme ça :

En général, cette pauvreté de la POO est frappante dans le contexte de sa brillance. Pourquoi ne pouvons-nous pas initialiser les variables et les tableaux comme d'habitude lors de leur déclaration? Je ne doute pas que les théoriciens trouveront de nombreuses théories pour prouver que je suis un idiot, mais quand même...

J'ai exactement la même pensée)) chaque fois que j'écris avec la POO.

 
Pavel Verveyko:

C'était aussi une idée, il peut être placé dans la portée globale en dehors de toute classe.
C'est encore plus facile, mais je voulais que ce soit OOP))

class CTest{
public:
   int a[4];
   CTest(){
      static int _a[]={1,2,3,4};
      ArrayCopy(a,_a);
   }
};
 
Igor Makanu:

vous pouvez

ou peut-être cherchez-vous une initialisation de tableau statique après tout ?

option intéressante.

appelle-t-il une "méthode avec constructeur" ?

 
Pavel Verveyko:

option intéressante.

est-ce un appel à une "méthode avec constructeur" ?

pas de

c'est ainsi que l'on initialise les statiques.

vous n'avez pas besoin de l'initialiser, c'est à ça que ressemblera le code :

class A
{
public:
   static bool Mass[5];
               A() { ArrayPrint(Mass); }
};

static bool A::Mass[5];
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
}
//+------------------------------------------------------------------+

ce n'est pas un appel de méthode mais le nom complet du champ de la classe A::Mass[5] ;

mais si vous supprimez la ligne, il y a une erreur de compilation - les statiques doivent allouer de la mémoire avant la création de l'instance de la classe - c'est ce que fait la ligne jaune
 
Igor Makanu:

pas de

voici comment s'écrit l'initialisation de la statique

vous n'avez pas besoin de l'initialiser, c'est à ça que ressemblera le code :

merci, il s'avère que cette ligne(static bool A::Mass[5] ;) ne peut être transférée au constructeur d'aucune manière ?

 
Pavel Verveyko:

ou est-ce la seule façon d'initialiser les statiques dans un cas comme celui-ci ?

poste ci-dessus complété

oui, la statique doit être décrite séparément,@fxsaber m'a aidé à la comprendrehttps://www.mql5.com/ru/forum/325418/page4#comment_16116740

vous pouvez initialiser les classes statiques dans MQL5 également.


Pavel Verveyko:

c'est-à-dire que cette ligne(static bool A::Mass[5] ;) ne peut pas être transférée au constructeur ?

Non, c'est un champ de classe statique. Vous devez allouer la mémoire à l'avance, et non au moment de la création de l'instance de la classe.

et vous l'utiliserez ensuite comme un tableau habituel

Si la question porte sur l'initialisation sous la forme d'une seule chaîne, alors la version de Sergei est ce que vous recherchez, et vous n'avez pas besoin de statique.

 
Igor Makanu:

poste ci-dessus complété

oui, la statique doit être décrite séparément,@fxsaber m'a aidé à la comprendrehttps://www.mql5.com/ru/forum/325418/page4#comment_16116740

vous pouvez également initialiser des classes statiques dans MQL.

Merci, maintenant je l'ai essayé et j'ai réalisé qu'il est possible d'accéder à un tableau de cette façon.

int OnInit()
{
   ArrayPrint(A::Mass);

   return(INIT_SUCCEEDED);
}

Pour être honnête, nous avons OOP, mais je ne l'ai pas vu dans Help. C'est dommage qu'il ne décrive pas de telles nuances.

Merci beaucoup à tous ceux qui ont répondu !