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

 
sergeev:

Qu'est-ce que c'est ?

C'est ce que vous avez demandé. Une instance d'une classe... avec un modificateur externe. Absurde, bien sûr. Mais...

C'est ce que tu as dit. Mais je n'ai pas trouvé cela nécessaire.

sergeev:

Mais ne serait-ce pas une bonne idée de rendre une instance d'une structure externe ?

Je ne comprends pas du tout ce que l'externalité a à voir avec cela ? Je n'ai pas besoin de "fabriquer" des données à partager, pour qu'elles puissent être incluses dans d'autres classes. Et ces variables ne doivent pas perdre leur valeur pendant l'exécution du programme, c'est-à-dire qu'elles doivent être statiques. Vous me parlez de l'extérieur. Pour quoi faire ?

 
hoz:

C'est ce que vous avez demandé. Une instance de classe... avec un modificateur externe. Absurde, bien sûr. Mais...

Est-ce que ça a compilé ?


Je n'ai pas besoin de "fabriquer" des données à partager,
comme vous en avez besoin ?
 
sergeev:

Est-ce que ça a compilé ?

Je n'ai pas vérifié. Comme ce qui est nécessaire n'a pas encore été mis en œuvre.

sergeev:

De quoi avez-vous besoin ?

Je vais répéter ce dont j'ai besoin... Il existe une structure dont les membres doivent sauvegarder leurs valeurs pendant l'exécution du programme, mais lorsqu'on accède à une méthode de n'importe quelle classe qui utilise cette structure, les membres peuvent être modifiés. Je comprends qu'ils doivent être statiques. Ces membres doivent se trouver dans une seule instance. Les membres de cette structure seront utilisés par de nombreuses classes et par le conseiller expert lui-même.

C'était le cas avant :

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;

Mais, dans ce cas, il est peu commode de se référer à de telles variables, car le " nom " est long. I.e :

Symbol_Properties::gd_Pt = 0;

Comment mettre cela en œuvre ?

 
hoz:

Laissez-moi répéter ce dont j'ai besoin... Il existe une structure dont les membres doivent sauvegarder leurs valeurs pendant l'exécution du programme, mais lorsqu'on accède à une méthode de n'importe quelle classe qui utilise cette structure, les membres peuvent être modifiés. Je comprends qu'ils doivent être statiques. Ces membres doivent se trouver dans une seule instance. Les membres de cette structure seront utilisés par de nombreuses classes et par le conseiller expert lui-même.

quel est le problème de se référer à une seule variable créée ?

 

Et les désigner par NOM DE STRUCTURE.NOM DE MEMBRE ?

Mais existe-t-il une garantie que cette variable ne perdra pas sa valeur actuelle au moment de l'exécution?

 
hoz:

Et les désigner par STRUCTURE NAME.MEMBER NAME ?

nom de la variable.nom du membre.


Mais y a-t-il une garantie que cette variable ne perdra pas sa valeur actuelle pendant l'exécution du programme ?

Par exemple, le QG ?

Avez-vous une exécution multithread dans EA ?

Que voulez-vous dire par "il va perdre" ? Ce que vous avez mis dedans, pourquoi le perdre ?

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

Chacun a le droit de vivre dans le monde de ses propres illusions,

mais détruire le monde de l'utilisateurhoz estexceptionnellement difficile

parce que tu ne peux pas entrer dans sa tête et comprendre ce qu'il imagine.

"ne perdra pas sa valeur actuelle" - Vous pensez que les variables sont créées pour perdre leurs valeurs ?

Ce qui, en réalité :

Les variables ontune portée, une durée de stockage et un lien.

Apprenez ce que c'est : quelle variable a quelle portée, quand elle est visible, quand elle est créée, quand elle est détruite et où et quand elle peut être passée.

Brève description de la durée de vie du stockage :
statique (variable déclarée en dehors de toutes les fonctions ou avec le spécificateur static) - moment de la mort = fin de l'existence du programme

automatique (une variable déclarée à l'intérieur d'une fonction) - heure de la mort = quitter la fonction où elle est créée

dynamique (variable créée à l'aide du mot clé new) - moment de la mort = utilisation du mot clé delete

 
sergeev:

Avez-vous le multithreading dans l'EA ?

Que voulez-vous dire par "il sera perdu" ? Ce que vous mettez là sera là, pourquoi serait-il perdu ?


Ouvre la documentation ici et voit ça :

//+------------------------------------------------------------------+
//| Класс "Анализатор текстов"                                       |
//+------------------------------------------------------------------+
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;

Si les variables de classe ou de structure ne perdent pas leur valeur pendant l'exécution du programme, pourquoi sont-elles déclarées comme statiques ici ?

Ils sont dans la section publique, vous pouvez dire que comme dans la structure...

 
hoz:

Ouvre la documentation ici et voit ça :

Si les variables de classe ou de structure ne perdent pas leur valeur à l'exécution, pourquoi sont-elles déclarées comme statiques ici ?

Ils sont dans la section publique, vous pouvez dire que comme dans la structure...


Alors... Lisez la deuxième phrase du lien qui vous a été donné.

Un static dans une classe a une signification légèrement différente de celle d'un static dans une fonction.

 
hoz:

Si les variables de classe ou de structure ne perdent pas leur valeur à l'exécution, pourquoi sont-elles déclarées statiques ici ?

Ils sont dans la section publique, on pourrait dire comme dans la structure...


Vous êtes soit obtus, soit obtuse, désolé d'être brutal, mais c'est écrit noir sur blanc :

Par exemple, nous avons une classeCParser destinée à analyser des textes, et nous avonsbesoin de compterle nombre total de mots et de caractères traités. Il suffitde déclarer lesmembres de la classe nécessairesstatiques et de lesinitialiser globalement.Ensuite, toutes les instances de la classeutiliseront des compteurs de mots et de caractères communs lors du travail.

Partout où il y a une référence à :

Les variables de classe ou de structure perdent leur valeur au moment de l'exécution.

Il dit que, en respectant les principes de la POO et en ne créant pas de variables globales, nous pouvons compter le nombre de mots à l'aide d'un membre statique de la classe,

il(membre statique de la classe) est créé en tant qu'instance unique et ne dépend pas du nombre d'objets d'une classe donnée qui sont créés.