Возможно ли реализовать паттерн singleton на MQL4. - страница 5

 
sergeev:

что это??

Это то что вы просили. Экземпляр класса.. с модификатором extern. Абсурд, конечно. Но.. 

Вот тут Вы про это и сказали. Правда надобности в этом я не нашёл. 

sergeev:

а экземпляр структуры сделать extern не судьба?

 

Я вообще не понимаю причём тут extern ? Мне не нужно сделать "сделать" так, чтоб некоторые данные были общими, и их включать в любые другие классы можно было. Причём, это переменные не должны терять значения в процессе выполнения программы, т.е. быть статичными. Вы же мне говорите про extern. Зачем?

 
hoz:

Это то что вы просили. Экземпляр класса.. с модификатором extern. Абсурд, конечно. Но..

у вас оно вообще скомпилировалось?


Мне не нужно сделать "сделать" так, чтоб некоторые данные были общими,
 как вам нужно?
 
sergeev:

у вас оно вообще скомпилировалось?

Я не проверял. Т.к. то, что нужно ещё не реализовано.

 

 

sergeev:

как вам нужно?

Повторю что мне нужно... Есть структура, члены которой должны сохранять свои значения в процессе выполнения программы, но при обращении любого метода любого класса, который используется данную структуру члены могут модифицироваться. Я так понимаю, они должны быть статическими. Данные члены должны быть в единственном экземпляре. Члены данной структуры будут использоваться многими классами и самим экспертом тоже.

Было так:

struct Symbol_Properties
{
   static datetime    gdt_Quote;           // Время поступления последней котировки
   static double      gda_Price [2];       // Текущие рыночные цены (0 - Bid, 1- Ask)
   static double      gd_Spread;           // Размер спреда в пунктах
   static double      gd_Swap;             // Своп
   static double      gd_Comission;        // Комиссия
   static double      gd_Pt;               // Величина одного пункта
   static int         gi_Digits;           // Количество знаков в цене после запятой
   static int         gi_StopLevel;        // Минимально-допустимый уровень стоп-лосса/тейк-профита в пунктах
   static int         gi_FreezLevel;       // Уровень заморозки ордеров в пунктах
};

Symbol_Properties::gdt_Quote = 0;
Symbol_Properties::gda_Price [2] = {0.0, 0.0};
Symbol_Properties::gd_Spread = 0;
Symbol_Properties::gd_Swap = 0;
Symbol_Properties::gd_Comission = 0;
Symbol_Properties::gd_Pt = 0;
Symbol_Properties::gi_Digits = 0;
Symbol_Properties::gi_StopLevel = 0;
Symbol_Properties::gi_FreezLevel = 0;

 Но, в таком случае, обращаться к таким переменным неудобно, т.к. " имя " длинное. Т.е:

Symbol_Properties::gd_Pt = 0;

 Как это реализовать?

 
hoz:

Повторю что мне нужно... Есть структура, члены которой должны сохранять свои значения в процессе выполнения программы, но при обращении любого метода любого класса, который используется данную структуру члены могут модифицироваться. Я так понимаю, они должны быть статическими. Данные члены должны быть в единственном экземпляре. Члены данной структуры будут использоваться многими классами и самим экспертом тоже.

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

 

И обращаться к ним по ИМЯ СТРУКТУРЫ.ИМЯ ЧЛЕНА ?

Но разве есть гарантия того, что данная переменная в процессе выполнения программы не потеряет своё текущее значение? 

 
hoz:

И обращаться к ним по ИМЯ СТРУКТУРЫ.ИМЯ ЧЛЕНА ?

имя переменной.имя члена.


Но разве есть гарантия того, что данная переменная в процессе выполнения программы не потеряет своё текущее значение? 

ээээ шта о_О?

у вас что мультипотоковое выполнение в эксперте?

что значит потеряет? что туда запишите то и будет, чего оно теряться должно?

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

Каждый имеет право жить в мире своих иллюзий,

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

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

 

" не потеряет своё текущее значение " - по вашему переменные созданные чтобы терять свои значения?

 Что в реальности:

Переменные обладают областью видимости (scope), временем жизни (storage duration), связыванием (linkage).

Выучите что это : когда какая переменная чем владеет, откуда видно, когда создается, когда уничтожается, куда и когда ее можно передавать.

Кратко про  временем жизни (storage duration):
static (переменная объявленная вне всех функций или с спецификатором static) - время смерти = прекращения существования программы

automatic (переменная объявленная внутри функции) - время смерти = выход из функции в которой создана

dynamic (переменная созданная с помощью ключевого слова new) - время смерти = использование ключевого слова delete

 
sergeev:

у вас что мультипотоковое выполнение в эксперте?

что значит потеряет? что туда запишите то и будет, чего оно теряться должно?


 Открывает документацию тут и видим, что:

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
class СParser
  {
public:
   static int        s_words;
   static int        s_symbols;
   //--- конструктор и деструктор
                     Parser(void);
                    ~Parser(void){};
  };
...
//--- инициализация статических членов класса Parser на глобальном уровне
int CParser::s_words=0;
int CParser::s_symbols=0;

 Если переменные класса или структуры не теряют свои значения в процессе выполнения программы, то зачем тут они объявлены как static ?

 Они в секции паблик, можно сказать, что как в структуре... 

 
hoz:

 Открывает документацию тут и видим, что:

 Если переменные класса или структуры не теряют свои значения в процессе выполнения программы, то зачем тут они объявлены как static ?

 Они в секции паблик, можно сказать, что как в структуре... 

 


Затем... Второе предложение по приведенной вам ссылке прочитайте.

Статик в классе имеет несколько другой смысл нежели статик в функции.

 
hoz:

 Если переменные класса или структуры не теряют свои значения в процессе выполнения программы, то зачем тут они объявлены как static ?

 Они в секции паблик, можно сказать, что как в структуре... 


Вы или тугодум, или тугодум, извините за прямоту, черным по белому написано:

Например, у нас есть класс CParser, предназначенный для синтаксического разбора текстов, и нам необходимо считать общее количество обработанных слов и символовДостаточно объявить нужные члены класса статическими и инициализировать их на глобальном уровне. Тогда все экземпляры класса при работе будут использовать общие счетчики слов и символов. 

 Где тут хоть раз вспоминалось об:

переменные класса или структуры теряют свои значения в процессе выполнения программы 

Тут сказано что сохраняя принципы ООП и не создавая глобальных переменных мы можем подсчитать количество каких-то там слов с помощью статического члена класса,

он  (статический члена класса) создается в едином экземпляре и не зависит от количества созданных объектов данного класса.