Вопросы по ООП в MQL5 - страница 84

 
Pavel Verveyko:
можно ли статический массив объявить в секции класса public, а инициализировать в конструкторе? (как указано ниже) (или только поэлементно?)

можно

а может быть Вы все таки инициализацию статического массива ищете?

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:
можно ли статический массив объявить в секции класса public, а инициализировать в конструкторе? (как указано ниже) (или только поэлементно?)

Примерно так:

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

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

A a;
Вообще поражает эта нищета ООП на фоне его блеска. Ну почему нельзя инициализировать переменные и массивы как обычно при их объявлении? Не сомневаюсь, теоретики сейчас двинут множество теорий, доказывающих мне, что я идиот, но все же...
 
Sergey Dzyublik:

Можно инициализировать локальный массив и выполнить ArrayCopy в соответствующее массив-поле:

Такая мысль тоже была, его можно и в глобальной области разместить вне всякого класса.
Так даже проще, но хотелось что бы всё было ООП))

 
Dmitry Fedoseev:

Примерно так:

Вообще поражает эта нищета ООП на фоне его блеска. Ну почему нельзя инициализировать переменные и массивы как обычно при их объявлении? Не сомневаюсь, теоретики сейчас двинут множество теорий, доказывающих мне, что я идиот, но все же...

меня посещает точно такая же мысль)) каждый раз когда пишу с применением ООП.

 
Pavel Verveyko:

Такая мысль тоже была, его можно и в глобальной области разместить вне всякого класса.
Так даже проще, но хотелось что бы всё было ООП))

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

можно

а может быть Вы все таки инициализацию статического массива ищете?

интересный вариант.

это вызов "метода с конструктором"?

 
Pavel Verveyko:

интересный вариант.

это вызов "метода с конструктором"?

нет

именно инициализация статиков так и пишется

можете не инициализировать, тогда так буде выглядеть код:

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

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

это не вызов метода, а полное имя поля класса  A::Mass[5];

но если удалите строку, то будет ошибка компилятора - статикам нужно распределять память до момента создания экземпляра класса - это и делает желтая строчка
 
Igor Makanu:

нет

именно инициализация статиков так и пишется

можете не инициализировать, тогда так буде выглядеть код:

спасибо, получается что эту строку (static bool A::Mass[5];) не перенести в конструктор ни как?

 
Pavel Verveyko:

или статики только так инициализируются в подобном случае?

пост выше дополнил

да, статики нужно отдельно описать, вот @fxsaber помогал разобраться https://www.mql5.com/ru/forum/325418/page4#comment_16116740

можно и статические классы так инициализировать в MQL


Pavel Verveyko:

спасибо, получается что эту строку (static bool A::Mass[5];) не перенести в конструктор ни как?

нет, это стаик поле класса, пишу же память нужно распределить заранее, а не в момент создания экземпляра класса

а пользоваться будете в дальнейшем как обычным массивом

если вопрос вообще в инициализации в виде одной стсроик, то вариант Сергея это то, что Вы ищете, и статики Вам просто не нужны

 
Igor Makanu:

пост выше дополнил

да, статики нужно отдельно описать, вот @fxsaber помогал разобраться https://www.mql5.com/ru/forum/325418/page4#comment_16116740

можно и статические классы так инициализировать в MQL

спасибо, сейчас попробовали понял что можно получить доступ к массиву и так.

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

   return(INIT_SUCCEEDED);
}

честно говоря ООП у нас есть а вот в справке я такого не встречал. очень жаль что справка не описывает таких тонкостей.

большое Спасибо, всем кто откликнулся!

Причина обращения: