Est-il possible d'implémenter un modèle singleton dans MQL4 ? - page 2

 
Mais pour une raison quelconque, il y a beaucoup d'erreurs au moment de la compilation. Qu'est-ce qu'il y a ?

De quels paternas pouvons-nous parler si vous ne connaissez pas les bases, vous ne pourriez même pas créer correctement un champ de classe statique.

(il y a beaucoup d'articles sur singleton sur hobber, à quoi ça sert, comment le faire et ce qui ne va pas avec).

Singleton ou classe statique ?
Utilisation du modèle singleton
 
ALXIMIKS:

(il y a beaucoup d'articles sur le Hubra à propos de singleton et à quoi il sert, et comment, et ce qui ne va pas avec lui)

Classe singleton ou classe statique ?
Utilisation du modèle Singleton.

Tu crois que je n'ai jamais rencontré ça ? Je n'ai pas encore compris comment ça marche. Voilà le truc. Mais il s'avère que je n'ai pas besoin d'un singleton. Je vais donc me contenter de membres statiques.

ALXIMIKS:

Comment pouvons-nous parler de paternels si vous ne connaissez pas les bases, vous ne pourriez même pas créer correctement un champ de classe statique.

Si vous savez comment, vous pouvez le corriger. Hier, j'ai écrit selon la documentation. Mais il y a aussi beaucoup d'erreurs. Comme ça :

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;

Quelle est la prochaine étape ?

 
static double       gd_Spread; 
int  Symbol_Properties::gd_Spread = 0;
pas triste à propos de quoi que ce soit ?
 
Естественно, создавать несколько объектов в разных классах данных структур крайне не рекомендуется.
Dites-moi de quoi il s'agit. Et traduisez plus clairement la citation ci-dessus, hélas je ne comprends rien, merci.
 

J'ai jeté le mauvais. Quoi qu'il en soit, la version actuelle est correcte ici :

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;

Je suppose que je dois maintenant faire référence à chaque variable statique par un nom aussi long ?

Symbol_Properties::gd_Spread = 0;

Ou est-il plus facile de l'implémenter de sorte qu'après la description de la structure d'initialisation de la variable, lorsqu'elle est initialisée, le membre statique correspondant doit être assigné à une variable de type :

double Spread = Symbol_Properties::gd_Spread = 0;

Et ensuite, dans le code, on fait référence aux variables statiques correspondantes par cette variable, n'est-ce pas ?

 
hoz:

Bien, bien... L'essentiel est queVadim sache : )))))

Oui, c'est le genre de dialogue normal :

Q : Mes amis m'ont recommandé des bonbons. C'est juste ce dont j'ai besoin !

Moi : (perplexe... Qu'est-ce que ça a à voir avec les bonbons ? Peut-être que B va à l'anniversaire d'un ami ou qu'il veut faire plaisir aux enfants, les siens ou ceux d'un autre ? Peut-être qu'il s'est lancé dans les affaires et vend maintenant des bonbons. Peut-être que c'était le dernier bonbon en Biélorussie et que B est maintenant un monopoliste. Et si les sucreries manquaient à B ? Beaucoup d'autres pensées m'ont traversé l'esprit sur le sujet "pourquoi des bonbons et que faire avec". Une fois de plus, comme avec B, mes capacités télépathiques m'ont fait défaut. Rien ne m'est venu à l'esprit).

Pas un indice.

Juste au cas où. Il est impoli de publier des dialogues sans le consentement de toutes les personnes impliquées dans la conversation. C'est méchant.
 

1. A quoi sert tout cela ?

2. Il existe deux façons d'accéder aux champs statiques d'une classe (la structure est une classe à accès public par défaut et par héritage) :

(a) Par l'intermédiaire de l'espace de nom de la classe - par exempleSymbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) - la valeurSpread devient égale àgd_Spread de la classeSymbol_Properties

(double Spread = Symbol_Properties::gd_Spread =0) valeur degd_Spread de laclasse Symbol_Properties et la valeur deSpread devient égale à 0

b) créer un objet de classe (par exemple,Symbol_Properties obj ; ) et s'y référer en tant que champ habituel de la classe à travers cet objet

(double Spread = obj.gd_Spread)

(double Spread = obj.gd_Spread =0)

 
ALXIMIKS:

1. A quoi ça sert ?

Commodité... Après tout, si ces variables sont utilisées dans une seule instance, pourquoi devrais-je créer un objet ? En outre, il est beaucoup plus pratique de lire le code en se référant à une variable, si VARIABLE.NOM DE LA VARIABLE.

ALXIMIKS:

2. Il y a deux façons d'accéder aux champs statiques d'une classe (la structure est une classe avec un accès public par défaut et un héritage)

(a) via l'espace de nom de la classe - par exempleSymbol_Properties::gd_Spread

(double Spread = Symbol_Properties::gd_Spread) - la valeurSpread devient égale àgd_Spread de la classeSymbol_Properties

(double Spread = Symbol_Properties::gd_Spread =0)- la valeurgd_Spread de la classeSymbol_Properties et la valeurSpread devient égale à 0

Exactement ! C'est pourquoi je l'ai fait de cette façon. J'initialise immédiatement la variable qui fait référence à la variable de cette structure par zéro et ensuite elle est stockée en mémoire tout le temps. Ce qui est logique, car ces variables sont nécessaires dans une seule instance. C'est pourquoi il n'y a aucune raison de créer un objet différent dans ce cas. Après tout, il est logique... Vous n'êtes pas d'accord avec moi ?

ALXIMIKS:

b) Créez un objet de classe (par exempleSymbol_Properties obj ; ) et faites-y référence comme à un champ de classe normal par le biais de cet objet.

Dans ce cas, les variables ne seront pas statiques, et il n'y a aucune garantie qu'elles ne conserveront pas leurs valeurs au cours de l'exécution du programme.
 
Qu'est-ce qui ne va pas avec la VARIABLE STATIQUE, ou les constantes par exemple ?
 

STATE VARIABLE ne m'a pas plu, car ils sont utilisés dans des classes différentes. Alors je les ai regroupés.

Les constantes ne sont pas appréciées car elles ne changent pas leurs valeurs, alors que ces variables devraient pouvoir changer leurs valeurs.