Questions sur la POO dans MQL5 - page 3

 

Si tous les boutons ne fonctionnent qu'avec une seule ligne à la fois, créez une variable statique dans la classe du bouton pour faire référence à la ligne. Mais cela n'est pas raisonnable, car cela limite les possibilités de la classe de boutons - vous ne pouvez pas créer deux paires de boutons pour travailler avec deux lignes en parallèle.

Et la solution correcte au problème est élémentaire - écrire une fonction, la référence à la ligne est passée à la fonction, et la fonction passe cette référence aux objets boutons souhaités. Vous n'avez pas besoin de chercher des merveilles dans la POO.

Ou bien, vous pouvez écrire une classe qui crée deux boutons.

 
Dmitry Fedoseev:

Si tous les boutons ne fonctionnent qu'avec une seule ligne à la fois, créez une variable statique dans la classe du bouton pour faire référence à la ligne. Mais cela n'a pas de sens, car cela limite ce que la classe de boutons peut faire - vous ne pouvez pas créer deux paires de boutons pour travailler avec deux lignes en parallèle.

Oui, j'ai quatre paires de boutons et quatre lignes, donc j'ai également écarté la variable statique comme option.

Et la solution correcte au problème est élémentaire : écrire une fonction, le lien vers la ligne est passé à la fonction, et ce lien est passé aux objets boutons souhaités dans la fonction. Vous n'avez pas besoin de chercher des miracles dans la POO.

Eh bien, ou écrire une classe qui crée deux boutons.

Et je croyais aux miracles de la POO).

Merci pour ces options, je vais réfléchir à celle qui me conviendrait le mieux.

 
Vasiliy Pushkaryov:

Aidez-moi à résoudre un problème. Il y a deux boutons et une ligne. Un bouton, lorsqu'il est enfoncé, met la ligne en mode édition, et lorsqu'il est relâché, supprime la ligne. Le second bouton, lorsqu'il est cliqué, fixe la ligne, et lorsqu'il est cliqué, la remet en mode édition. Chaque bouton peut modifier la couleur et certaines autres propriétés de l'objet Ligne. L'objet "Ligne" est défini de manière globale. Est-il possible de passer une référence à l'objet "Ligne" à chaque bouton immédiatement après la création des boutons de sorte que lorsque vous manipulez la variable de référence à l'intérieur des objets "Bouton", tous les changements sont mémorisés dans l'objet global "Ligne".

J'ai esquissé un script simplifié ci-dessous, au lieu d'appuyer sur un bouton - fonction addition(), qui incrémente le compteur de l'objet "Ligne". Je comprends que vous pouvez passer l'objet "Line" comme argument de fonction par référence, mais dans la version de travail, il y a plusieurs fonctions de ce type, donc je voudrais passer la référence au début une seule fois. Est-il possible de faire en sorte que Btn1.addition() ou Btn2.addition() augmente le nombre de gLine.count ?

C'est comme ça que je le fais en ce moment :


peut-être que c'est la façon de faire ?

//+------------------------------------------------------------------+
class CLine
  {
public:
   int               count;
                     CLine(void){count=0;};
                    ~CLine(void){};
  };
//+------------------------------------------------------------------+
class CMyButton
  {
private:
public:
   CLine            *m_Line;
                     CMyButton(void):m_Line(NULL){};
                    ~CMyButton(void){};

   void bind(CLine *aLine) {m_Line=aLine;}
   void addition() {if(CheckPointer(m_Line)==POINTER_DYNAMIC){++m_Line.count;}}
  };


CMyButton  Btn1;
CMyButton  Btn2;

CLine *gLine;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   gLine = new CLine;
   Btn1.bind(GetPointer(gLine));
   Btn2.bind(GetPointer(gLine));
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   Print("Line.count=", gLine.count);
   Btn1.addition();
   Print("Line.count=", gLine.count, "  Btn1.m_Line.count=", Btn1.m_Line.count);
   Btn2.addition();
   Print("Line.count=", gLine.count, "  Btn2.m_Line.count=", Btn2.m_Line.count);
   Btn1.addition();
   Print("Line.count=", gLine.count, "  Btn1.m_Line.count=", Btn1.m_Line.count);
   Btn2.addition();
   Print("Line.count=", gLine.count, "  Btn2.m_Line.count=", Btn2.m_Line.count);
  }
//+------------------------------------------------------------------+

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

 
Igor Makanu:

peut-être que c'est comme ça que ça devrait être ?

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

Oui Igor, c'est ça, merci beaucoup.

Je suis toujours en train de "patauger" dans les pointeurs, donc votre solution va m'aider dans ma tâche actuelle et à mieux comprendre commentutiliser les pointeurs.

Merci pour vos commentaires.

 
Igor Makanu:

peut-être que c'est comme ça que ça devrait être ?

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=196

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=197 Btn1.m_Line.count=197

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=198 Btn2.m_Line.count=198

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=199 Btn1.m_Line.count=199

2019.07.04 00:44:30.464 1 (EURUSD,H1) Line.count=200 Btn2.m_Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=200

2019.07.04 00:44:31.856 1 (EURUSD,H1) Line.count=201 Btn1.m_Line.count=201

Et pourquoi utiliser GetPointer(gLine) si vous avez vous-même déclaré gLine comme un pointeur ? )))

Il faut également créer l'objet CLine lors de sa déclaration :

CLine* gLine=new CLine ;

Le bouton et la ligne doivent également être initialisés au stade de l'initialisation du bouton.

...
                CMyButton(CLine* line):m_Line(!CheckPointer(line)?NULL:line){};
...
CLine* gLine=new CLine;
CMyButton  Btn1(gLine);
 
Vladimir Simakov:

Pourquoi utiliser GetPointer(gLine) si vous avez vous-même déclaré gLine comme un pointeur ? )))

La formation d'un objet CLine est également une tâche urgente lors de sa déclaration :

CLine* gLine=new CLine ;

Le bouton et la ligne doivent également être initialisés au stade de l'initialisation du bouton.

C'était la nuit, je ne sais pas pourquoi je l'ai écrit comme ça... En fait, je dormais, Skype sur mon téléphone m'a réveillé, alors j'ai fait un tour sur le forum ;)))

Et sérieusement, mon exemple est un tutoriel, je ne l'ai pas vérifié, peut-être me suis-je réassuré à un niveau subconscient, je ne comprends pas bien ce qu'est un pointeur MQL, il est évident que cela ne fonctionne pas comme les pointeurs en C++...

J'ai essayé de comprendre, mais je n'ai pas compris comment les pointeurs fonctionnent en tant que paramètre de la fonctionhttps://www.mql5.com/ru/forum/1111/page2470#comment_11796309- je passe un pointeur à la fonction à cet endroit, mais en fait je reçois une nouvelle copie du pointeur créé.

SZY : Je n'arrive pas à comprendre quelle est la portée des pointeurs MQL, j'ai également demandé àhttps://www.mql5.com/ru/forum/1111/page2488#comment_12154218..... Je n'arrive pas à comprendre quels cas ont une portée locale et quels cas ont une portée globale ... Je travaille donc avec les pointeurs MQL par expérience scientifique (((


Vasiliy Pushkaryov:

Oui, Igor, c'est ça, merci beaucoup.

Je suis encore en train de "nager" dans les pointeurs, c'est pourquoi votre solution me sera très utile dans ma tâche actuelle et pour mieux comprendre comment utiliser les pointeurs.

Merci pour vos commentaires.

Avec les pointeurs MQL, seule la pratique peut aider ici, ils ont un comportement particulier, comme@Vladimir Simakov l'a écrit, votre problème est plus susceptible d'être résolu en écrivant un constructeur avec paramètre - je le fais habituellement, d'un point de vue abstrait ? - Ce n'est pas correct, mais c'est pratique et cela fonctionne toujours correctement - et le compilateur ne vous laissera pas oublier de lier le pointeur.

si(CheckPointer(m_Line)==POINTER_DYNAMIC)

cette vérification peut être éliminée car vous sauvegarderez de toute façon le pointeur lors de l'appel du constructeur.

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2019.05.22
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 

Wow, il s'avère que la tâche n'était pas d'attendre que deux objets passent un pointeur sur une ligne en même temps. Il s'agissait en fait de passer un pointeur. Qui l'aurait cru ?

Vous n'avez pas besoin de créer l'objet par new pour pouvoir passer un pointeur quelque part. Mais la classe à laquelle le pointeur est passé doit avoir une variable pointeur (avec un astérisque *).

 
Igor Makanu:

c'était la nuit, il fait sombre - pourquoi je l'ai écrit comme ça... J'étais en fait endormi, Skype sur mon téléphone m'a réveillé, alors j'ai parcouru le forum en passant ;)))

Et sérieusement, mon exemple est un tutoriel, je ne l'ai pas vérifié, peut-être me suis-je réassuré à un niveau subconscient, je ne comprends pas bien ce qu'est un pointeur MQL, il est évident que cela ne fonctionne pas comme les pointeurs en C++...

J'ai essayé de comprendre, mais je n'ai pas compris comment les pointeurs fonctionnent en tant que paramètre de la fonctionhttps://www.mql5.com/ru/forum/1111/page2470#comment_11796309- je passe un pointeur à la fonction à cet endroit, mais en fait je reçois une nouvelle copie du pointeur créé.

SZY : Je n'arrive pas à comprendre quelle est la portée des pointeurs MQL, j'ai également demandé àhttps://www.mql5.com/ru/forum/1111/page2488#comment_12154218..... Je ne comprends toujours pas quels cas ont une portée locale et quels cas ont une portée globale ... En somme, je travaille avec les pointeurs MQL en utilisant la méthode de l'expérience scientifique (((

Tout est simple dans le premier cas. Vous créez en fait un nouvel objet dynamique sur la pile, et c'est tout. Vous devez le passer dans le ...(CObj* &jbj,...

Et dans le second cas, vous devez le faire :

void  AddValue (T &value)  { Tptr  = value; mlist.Add(Tptr);       }
 
Vladimir Simakov:

Pour le premier cas, c'est simple. Vous créez en fait un nouvel objet dynamique sur la pile et c'est tout. Vous devez le passer dans le ...(CObj* &jbj,...).

Et dans le second cas, vous devriez :

Je vais vérifier ce soir, la référence ne donne pas beaucoup d'informations sur l'utilisation de &.

Merci !

 
Le pointeur peut également être transmis par non-référence - sans &.