Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай принцип работы Торговых Сигналов для MetaTrader
hoz
1936
hoz 2014.08.17 18:43 

 Как сделать член-элемент класса или структуры  статичным? При подобных попытках инициализировать член-элемент класса BaseInfo:

class BaseInfo
{
   private:
      int      IndErr;         // Индекс ошибок в массиве комментариев
      static int      LotDecimal;
      //---- Переменные Input

 Компилятор ругается:

unresolved static variable 'Lots_Properties::gd_LotStep'        MarketData.mqh  72      23

 В структурах тоже самое...

Почему спрашиваю. У меня вот есть функция:

int LotPrecision()
{
   static int gd_LotDecimal = 0;     // устанавливаем минимальную разрядность лота в ноль

   while (SLots.gd_LotStep < 1)
   {
      SLots.gd_LotStep *= 10;
      gd_LotDecimal++;
   }

   return (gd_LotDecimal);
}

 Если переменную объявляю, например, в самом эксперте в глобальном уровне, то всё работает отлично. Если она получается из структуры, как и должно быть, то после выхода из тела функции значение переменной SLots.gd_LotStep теряется. В чём причина? Возможно есть какой-то способ сделать данные переменные статичными?

Простак
315
Простак 2014.08.17 19:58  
hoz:

 Как сделать член-элемент класса или структуры  статичным? При подобных попытках инициализировать член-элемент класса BaseInfo:

 Компилятор ругается:

 В структурах тоже самое...

В классе/структуре статические члены только декларируются, их надо ещё определить, тогда компилятор не ругается:

#property strict

/******************************************************************************/
class BaseInfo
{
   private:
      int      IndErr;         // Индекс ошибок в массиве комментариев
      static int      LotDecimal;
      //---- Переменные Input
};

/******************************************************************************/
int BaseInfo::LotDecimal = 0;

/******************************************************************************/
void OnStart() {
  BaseInfo info;
}

Во время определения и инициализировать.

hoz
1936
hoz 2014.08.18 05:50  

simpleton, Благодарю! Вот об этом я в документации даже упоминания не встречал. Хотя весьма даже базовая необходимость. Мне только одно интересно. Почему объявление в конструкторе тут не подходит? С чем это связано? 

Sergey Dzyublik
4621
Sergey Dzyublik 2014.08.18 09:27  
hoz:

simpleton, Благодарю! Вот об этом я в документации даже упоминания не встречал. Хотя весьма даже базовая необходимость. Мне только одно интересно. Почему объявление в конструкторе тут не подходит? С чем это связано? 

статический член класса существует даже при отсутствии экземпляров класса, он создается в глобальной области памяти (наверное) в начале старта и живет до смерти программы, эта переменная как глобальная переменная только находится в области видимости класса и имеет модификатор доступа (public, protected, private).

цитата из с+:

Для выделения памяти под эту переменную ее повторно следует объявить в модуле компиляции, в котором она будет использоваться, квалифицируя имя статической переменной именем класса.

hoz
1936
hoz 2014.08.18 20:40  

 Сергей, я то это всё по логике понял. Тут по ходу статическая переменная выносится, чтоб быть видна ВСЕМ объектам данного класса и вообще ВСЕМ объектам и функциях кода (не тока данного класса). Получается, что она объявляется как объект.

 Мне вот интересно для структур тоже самое. Или они по умолчанию статичны т.к. члены-элементы и методы открыты. Заметил, что когда перекинул переменную функции проблемной в структуру, код стал работать исправно и значение переменной сохраняется. Правда, не понял почему.. 

/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий