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

 
Vladimir Simakov:
У меня допущение, что лота, например 0.15, не будет. По крайней мере я про такое не слышал. Если вдруг увижу когда, то переделаю.

да понятно, что такое маловероятно, но как всегда хочется идеального решения )))

ладно, это не самая большая проблема, вот проблему сам себе создал... захотелось идеального ООП, но чтобы не было лишних вызовов и все было оптимально

вот хочу иметь 5 экземпляров класса, но нужно поля класса один раз инициализировать - в них окружение терминала, которое не изменится в ходе выполнения программы, вот пример набросал, а не могу ни через static ни через наследование добиться однократной инициализации 

string         Language;

если объявляю static string         Language; - то будет ошибка unresolved static variable 'A::Language'

вот пример:

//+------------------------------------------------------------------+
class A
  {
public:
   string         Language;
                     A() { Print(__FUNCTION__); Language = TerminalInfoString(TERMINAL_LANGUAGE); }

  };
//+------------------------------------------------------------------+
class B:public A
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

в таком виде буду инициализировать string         Language целых 5 раз - это не правильно, а с модификаторами static не компилируется

да и не нужно иметь 5 копий переменной Language !!! - пробовал в классе B обьявлять экземпляр класса - тоже самое 5 переменных Language имею

2019.08.29 12:44:58.384 tst__ EURUSD,M15: initialized

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

 
Igor Makanu:

да понятно, что такое маловероятно, но как всегда хочется идеального решения )))

ладно, это не самая большая проблема, вот проблему сам себе создал... захотелось идеального ООП, но чтобы не было лишних вызовов и все было оптимально

вот хочу иметь 5 экземпляров класса, но нужно поля класса один раз инициализировать - в них окружение терминала, которое не изменится в ходе выполнения программы, вот пример набросал, а не могу ни через static ни через наследование добиться однократной инициализации 

если объявляю static string         Language; - то будет ошибка unresolved static variable 'A::Language'

вот пример:

в таком виде буду инициализировать string         Language целых 5 раз - это не правильно, а с модификаторами static не компилируется

2019.08.29 12:44:58.384 tst__ EURUSD,M15: initialized

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

class Test
  {
private:
   static const string Language;
public:
                     Test(void){}
                    ~Test(void){}
  };
static const string Test::Language=::TerminalInfoString(TERMINAL_LANGUAGE);
 
Andrey Barinov:

ОК, это вариант

но хочу все это в один класс обернуть - в моем примере класс B и хочу 5 экземпляров B, но не хочу 5 раз инициализировать  Language и соответственно не хочу иметь по переменной Language в каждом экземпляре

а как избавиться от лишних Language ?

 
Igor Makanu:

ОК, это вариант

но хочу все это в один класс обернуть - в моем примере класс B и хочу 5 экземпляров B, но не хочу 5 раз инициализировать  Language и соответственно не хочу иметь по переменной Language в каждом экземпляре

а как избавиться от лишних Language ?

Наследуйтесь. В таком виде проинициализированно будет только один раз.

 
Igor Makanu:

да понятно, что такое маловероятно, но как всегда хочется идеального решения )))

ладно, это не самая большая проблема, вот проблему сам себе создал... захотелось идеального ООП, но чтобы не было лишних вызовов и все было оптимально

вот хочу иметь 5 экземпляров класса, но нужно поля класса один раз инициализировать - в них окружение терминала, которое не изменится в ходе выполнения программы, вот пример набросал, а не могу ни через static ни через наследование добиться однократной инициализации 

если объявляю static string         Language; - то будет ошибка unresolved static variable 'A::Language'

вот пример:

в таком виде буду инициализировать string         Language целых 5 раз - это не правильно, а с модификаторами static не компилируется

да и не нужно иметь 5 копий переменной Language !!! - пробовал в классе B обьявлять экземпляр класса - тоже самое 5 переменных Language имею

2019.08.29 12:44:58.384 tst__ EURUSD,M15: initialized

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:58.384 tst__ EURUSD,M15: B::BRussian

2019.08.29 12:44:58.384 tst__ EURUSD,M15: A::A

2019.08.29 12:44:57.989 tst__ EURUSD,M30: uninit reason 3

Сейчас с телефона. Вечером напомни, покажу как решать можно.
 
Andrey Barinov:

Наследуйтесь. В таком виде проинициализированно будет только один раз.

По моему работает

//+------------------------------------------------------------------+
string MyTerminalInfoString()
  {
   Print(__FUNCTION__);
   return("ru");
  }
//+------------------------------------------------------------------+
class CLang
  {
protected:
   static const string Language;
public:
                     CLang(void) {Print(__FUNCTION__);}
                    ~CLang(void) {}
  };
//+------------------------------------------------------------------+
static const string CLang::Language=MyTerminalInfoString();
//+------------------------------------------------------------------+
class B:public CLang
  {
public:
                     B() {Print(__FUNCTION__,Language); }
  };
//+------------------------------------------------------------------+
B *arrB[5];
//+------------------------------------------------------------------+
int OnInit()
  {
   for(int i=0; i<5; i++)
      arrB[i] = new B;
   return(INIT_SUCCEEDED);
  }

2019.08.29 13:24:19.690 tst__ EURUSD,M15: initialized

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: B::Bru

2019.08.29 13:24:19.690 tst__ EURUSD,M15: CLang::CLang

2019.08.29 13:24:19.690 tst__ EURUSD,M15: MyTerminalInfoString


по крайней мере вызов MyTerminalInfoString() вижу один раз


в общем некий Singleton вроде как получился

Спасибо!

 
Vladimir Simakov:
Сейчас с телефона. Вечером напомни, покажу как решать можно.

ОК, если не затруднит

и тема Singleton довольно нова для меня, есть поле для творчества - примеров бы 

 
Igor Makanu:

ОК, если не затруднит

и тема Singleton довольно нова для меня, есть поле для творчества - примеров бы 

Так Вам singlton надо, или общее поле для объектов?
 
Vladimir Simakov:
Так Вам singlton надо, или общее поле для объектов?

сложно сказать что я хочу )))

попробую на словах:

 - хочу класс который конструктором инициализируется и этот класс не будет иметь методов, задача класса открыть ордер и в дальнейшем по сценарию закрыть и / или переоткрыть еще несколько раз ордера, тип сценария - перечисление

- буду использовать массив экземпляров такого класса - шт 5 не менее

- чтобы отрыть ордер не хочу окружение терминала каждый раз вызывать, поэтому хочу SYMBOL_VOLUME_MAX , Symbol,SYMBOL_VOLUME_MIN и кол-во знаков в SYMBOL_VOLUME_STEP иметь константными значениями в классе

- хочу оптимальное использование переменных, т.е. не хочу дублировать константы в предыдущем пункте


вот примерно так вижу все это, но в целом теперь задача свелась к правильной структуре самого класса, как оказалось уже придется наследоваться, чтобы SYMBOL_VOLUME_MAX , Symbol,SYMBOL_VOLUME_MIN ... одну копию иметь, думаю что еще споткнусь об вывод ошибок, использовать буду, что то как вот из моего  PrintLastError.mqh   https://www.mql5.com/ru/code/24829#

 
Статическая переменная, она и без наследования будет одна на все экземпляры.
Причина обращения: