Preguntas sobre POO en MQL5 - página 84

 
Pavel Verveyko:
¿Es posible declarar un array estático en una sección de la clase pública e inicializarlo en el constructor? (como abajo) (¿o sólo elemento por elemento?)

puedes

¿o tal vez lo que buscas es una inicialización estática del array después de todo?

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:
¿se puede declarar un array estático en la sección pública de la clase e inicializarlo en el constructor? (como abajo) (¿o sólo elemento por elemento?)

Es algo así:

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

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

A a;
En general, esta pobreza de la POO es sorprendente frente a su brillantez. ¿Por qué no podemos inicializar las variables y las matrices como siempre al declararlas? No lo dudo, los teóricos moverán ahora un montón de teorías demostrando que soy un idiota, pero aun así...
 
Sergey Dzyublik:

Puedes inicializar un array local y realizar ArrayCopy al campo del array correspondiente:

Esto también fue una idea, se puede colocar en el ámbito global fuera de cualquier clase también.
Es incluso más fácil, pero quería que fuera OOP))

 
Dmitry Fedoseev:

Es algo así:

En general, esta pobreza de la POO es sorprendente frente a su brillantez. ¿Por qué no podemos inicializar las variables y las matrices como siempre al declararlas? No lo dudo, los teóricos moverán ahora un montón de teorías demostrando que soy un idiota, pero aun así...

Tengo exactamente el mismo pensamiento)) cada vez que escribo usando OOP.

 
Pavel Verveyko:

Esto también fue una idea, se puede colocar en el ámbito global fuera de cualquier clase.
Es incluso más fácil, pero quería que fuera OOP))

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

puedes

¿o tal vez lo que buscas es la inicialización de arrays estáticos después de todo?

opción interesante.

es llamar a un "método con constructor"?

 
Pavel Verveyko:

interesante opción.

¿es una llamada a un "método con constructor"?

no

así es como se inicializa la estática.

no tienes que inicializarlo, así es como se verá el código:

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

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

no es una llamada a un método, sino el nombre completo del campo de la clase A::Mass[5];

pero si borras la línea, hay un error de compilación - la estática necesita asignar memoria antes de que se cree la instancia de la clase - esto es lo que hace la línea amarilla
 
Igor Makanu:

no

así es como se escribe la inicialización de la estática

no tienes que inicializarlo, así es como se verá el código:

gracias, resulta que esta línea(static bool A::Mass[5];) no se puede trasladar al constructor de ninguna manera?

 
Pavel Verveyko:

¿o es ésta la única forma de inicializar la estática en un caso como éste?

post anterior complementado

sí, la estática debe ser descrita por separado,@fxsaber me ayudó a entenderlohttps://www.mql5.com/ru/forum/325418/page4#comment_16116740

puedes inicializar clases estáticas en MQL5 también.


Pavel Verveyko:

es decir, esta línea(static bool A::Mass[5];) no puede ser transferida al constructor?

No, es un campo estático de la clase. Es necesario asignar la memoria por adelantado, no en el momento de la creación de la instancia de la clase

y lo utilizarás más adelante como un array habitual

Si la pregunta es sobre la inicialización en forma de una sola cadena, entonces la versión de Sergei es lo que buscas, y simplemente no necesitas la estática.

 
Igor Makanu:

post anterior complementado

sí, la estática debe ser descrita por separado,@fxsaber me ayudó a entenderlohttps://www.mql5.com/ru/forum/325418/page4#comment_16116740

puedes inicializar clases estáticas en MQL también.

Gracias, ahora lo he probado y me he dado cuenta de que es posible acceder a un array de esa manera.

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

   return(INIT_SUCCEEDED);
}

La verdad es que tenemos OOP, pero no lo he visto en la Ayuda. Es una pena que no describa esos matices.

¡Muchas gracias a todos los que habéis respondido!