Fragen zu OOP in MQL5 - Seite 84

 
Pavel Verveyko:
Ist es möglich, ein statisches Array in einem öffentlichen Klassenteil zu deklarieren und es im Konstruktor zu initialisieren? (wie unten) (oder nur Element für Element?)

können Sie

oder sind Sie vielleicht doch auf der Suche nach einer statischen Array-Initialisierung?

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:
Kann ein statisches Array im öffentlichen Klassenteil deklariert und im Konstruktor initialisiert werden? (wie unten) (oder nur Element für Element?)

Es geht ungefähr so:

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

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

A a;
Im Allgemeinen ist diese Armut der OOP vor dem Hintergrund ihrer Brillanz auffällig. Warum können wir Variablen und Arrays nicht wie üblich initialisieren, wenn wir sie deklarieren? Ich bezweifle nicht, dass die Theoretiker jetzt eine Menge Theorien aufstellen werden, die mich als Idioten hinstellen, aber trotzdem...
 
Sergey Dzyublik:

Sie können ein lokales Array initialisieren und ArrayCopy in das entsprechende Arrayfeld ausführen:

Dies war auch ein Gedanke, kann es in globalen Bereich außerhalb jeder Klasse als gut platziert werden.
Es ist sogar noch einfacher, aber ich wollte, dass es OOP ist))

 
Dmitry Fedoseev:

Es geht ungefähr so:

Im Allgemeinen ist diese Armut der OOP vor dem Hintergrund ihrer Brillanz auffällig. Warum können wir Variablen und Arrays nicht wie üblich initialisieren, wenn wir sie deklarieren? Ich bezweifle nicht, dass die Theoretiker viele Theorien aufstellen werden, um zu beweisen, dass ich ein Idiot bin, aber trotzdem...

Ich habe jedes Mal, wenn ich mit OOP schreibe, genau denselben Gedanken)).

 
Pavel Verveyko:

Dies war auch ein Gedanke, kann es in den globalen Bereich außerhalb einer Klasse platziert werden.
Es ist sogar noch einfacher, aber ich wollte, dass es OOP ist))

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

können Sie

oder sind Sie vielleicht doch auf der Suche nach einer statischen Array-Initialisierung?

interessante Option.

ruft eine "Methode mit Konstruktor" auf?

 
Pavel Verveyko:

Interessante Option.

ist dies ein "Methode mit Konstruktor"-Aufruf?

keine

So initialisiert man die Statik.

Sie müssen es nicht initialisieren, der Code wird so aussehen:

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

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

Dies ist kein Methodenaufruf, sondern der vollständige Name des Feldes der Klasse A::Mass[5];

aber wenn Sie die Zeile löschen, kommt es zu einem Compilerfehler - Statics müssen Speicher zuweisen, bevor die Klasseninstanz erstellt wird - das ist, was die gelbe Zeile tut
 
Igor Makanu:

keine

So wird die Initialisierung der Statik geschrieben

Sie müssen es nicht initialisieren, der Code wird so aussehen:

vielen Dank, es stellt sich heraus, dass diese Zeile(static bool A::Mass[5];) kann nicht auf Konstruktor in irgendeiner Weise übertragen werden?

 
Pavel Verveyko:

oder ist dies die einzige Möglichkeit, die Statik in einem solchen Fall zu initialisieren?

Beitrag oben ergänzt

ja, die Statik sollte separat beschrieben werden,@fxsaber hat mir geholfen, sie zu verstehenhttps://www.mql5.com/ru/forum/325418/page4#comment_16116740

können Sie auch in MQL5 statische Klassen initialisieren.


Pavel Verveyko:

d.h. diese Zeile(static bool A::Mass[5];) kann nicht in den Konstruktor übernommen werden?

Nein, es handelt sich um ein statisches Klassenfeld. Sie müssen den Speicher im Voraus zuweisen, nicht zum Zeitpunkt der Erstellung der Klasseninstanz.

und Sie werden es als gewöhnliches Array weiterverwenden

Wenn es um die Initialisierung in Form einer einzelnen Zeichenkette geht, dann ist die Version von Sergei das, was Sie suchen, und Sie brauchen keine Statik.

 
Igor Makanu:

Beitrag oben ergänzt

ja, die Statik sollte separat beschrieben werden,@fxsaber hat mir geholfen, sie zu verstehenhttps://www.mql5.com/ru/forum/325418/page4#comment_16116740

können Sie auch statische Klassen in MQL initialisieren.

Danke, jetzt habe ich es ausprobiert und festgestellt, dass es möglich ist, auf diese Weise auf ein Array zuzugreifen.

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

   return(INIT_SUCCEEDED);
}

Um ehrlich zu sein, wir haben OOP, aber ich habe es nicht in Help gesehen. Es ist schade, dass es solche Nuancen nicht beschreibt.

Vielen Dank an alle, die geantwortet haben!

Grund der Beschwerde: