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

 
Но почему-то ошибок много при компиляции. Что не так?

О каких патернах может идти речь если вы не знаете основ, даже правильно создать статическое поле класса не смогли.

(про  singleton на хабре куча статей и для чего, и как, и что плохого)

Singleton (Одиночка) или статический класс?
Использование паттерна синглтон 
 
ALXIMIKS:

(про  singleton на хабре куча статей и для чего, и как, и что плохого)

Singleton (Одиночка) или статический класс?
Использование паттерна синглтон 

Думаете я это не встречал? Я не совсем понял, как это работает. Вот в чём дело. Но по ходу мне синглтон не нужен. Так что обойдусь статическими членами.

 

ALXIMIKS:

О каких патернах может идти речь если вы не знаете основ, даже правильно создать статическое поле класса не смогли.

Если знаешь как, то поправил бы. Я вчера писал согласно документации. Но тоже ошибок море. Вот так:

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;       // Уровень заморозки ордеров в пунктах
};
int Symbol_Properties::gdt_Quote = 0;
int Symbol_Properties::gda_Price = 0;
int Symbol_Properties::gd_Spread = 0;
int Symbol_Properties::gd_Swap = 0;
int Symbol_Properties::gd_Comission = 0;
int Symbol_Properties::gd_Pt = 0;
int Symbol_Properties::gi_Digits = 0;
int Symbol_Properties::gi_StopLevel = 0;
int Symbol_Properties::gi_FreezLevel = 0;

 Дальше что?

 
static double      gd_Spread; 
int Symbol_Properties::gd_Spread = 0;
не печалит ни чего?
 
Естественно, создавать несколько объектов в разных классах данных структур крайне не рекомендуется.
Скажите для чего вам этот все? И переведите более понятно вышецитируемое, увы ни чего не понял, спасибо.
 

 Это я не то скинул. В общем текущий вариант верный вот:

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;       // Уровень заморозки ордеров в пунктах
};

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

 Я так понимаю, теперь мне к каждой статической переменной обращаться по такому длинному имени?

Symbol_Properties::gd_Spread = 0;

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

double Spread = Symbol_Properties::gd_Spread = 0;

 А потом в коде обращаться по данной переменной к соответствующим статически переменным, верно? 

 
hoz:

Ну да,.. Главное, что Вадим в курсе :)))))

Ага, нормальный такой диалог:

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

Я: (В недоумении... При чём тут конфеты? Возможно, В идёт на ДР к подруге или хочет угостить детей, может своих или чужих? Может он занялся бизнесом и теперь приторговывает конфетами? Может это были последние конфеты в Беларуссии и теперь В монополист? А вдруг В соскучился по сладкому?... Множество других мыслей пронеслось у меня в голове на тему "зачем конфеты и что с ними делать". Очередной раз, как и ранее в общении с В, мои телепатические способности подвели. Ничего в голову не приходило.)

Не в курсе.

На всякий случай. Неприлично выкладывать диалоги без согласия всех участвующих в беседе. Это подлость.
 

1. Для чего все это?

2. Есть два способа обращения к статическим полям класса (структура - это класс с public доступом по умолчанию и при наследовании):

 а) через пространство имен класса - например Symbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) - значение Spread  становится равным gd_Spread из класса Symbol_Properties

(double Spread = Symbol_Properties::gd_Spread = 0) значение gd_Spread  из класса Symbol_Properties и значение Spread  становятся равными 0

б) создать объект класса (например Symbol_Properties obj; ) и обращаться как к обычному полю класса через данный объект

 (double Spread = obj.gd_Spread)

double Spread = obj.gd_Spread = 0)

 
ALXIMIKS:

1. Для чего все это?

Удобство... Ведь если эти переменные используются  в единственном экземпляре, то зачем мне создавать объект? К тому же обращаясь к переменной, гораздо удобнее читать код, ежели ИМЯ ОБЪЕКТА.ИМЯ ПЕРЕМЕННОЙ.

 

ALXIMIKS:

2. Есть два способа обращения к статическим полям класса (структура - это класс с public доступом по умолчанию и при наследовании):

 а) через пространство имен класса - например Symbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) - значение Spread  становится равным gd_Spread из класса Symbol_Properties

(double Spread = Symbol_Properties::gd_Spread = 0) значение gd_Spread  из класса Symbol_Properties и значение Spread  становятся равными 0

 Вот именно! Я потому я так и сделал. Сразу инициализирую переменную, которая ссылается на переменную данной структуры нулём и дальше она хранится в памяти постоянно. Что логично, т.к. данные переменные необходимы в единственном экземпляре. Потому нет резона создавать различные объект в данном случае. Ведь логично же.. Не согласны со мной?

 

ALXIMIKS:

б) создать объект класса (например Symbol_Properties obj; ) и обращаться как к обычному полю класса через данный объект

 Тогда переменные не будут статичными, и нет гарантии, что они не будут сохранять свои значения в процессе работы программы.
 
а чем вам ПРОСТО СТАТИЧЕСКИЕ ПЕРЕМЕННЫЕ не угодили ??? ну или константы например ???
 

ПРОСТО СТАТИЧЕСКИЕ ПЕРЕМЕННЫЕ не угодили, т.к. они используются в различных классах. Так я их как-бы сказать сгруппировал.

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