Questions sur la POO dans MQL5 - page 12

 
Vasiliy Pushkaryov:

Un conseil sur une autre question. Si vous créez une classe enfant CMyButton à partir de CButton, vous pouvez créer un bouton et modifier ensuite ses propriétés en dehors de la classe. Ci-dessous, cela est fait dans OnInit().

Mais si je veux créer des champs supplémentaires dans la classe enfant et utiliser les propriétés intégrées de la classe CButton dans de nouvelles fonctions, comment puis-je le faire correctement ?

Dans la classe CButton, le membre de la classe m_button est déclaré dans la section private.

Je ne peux pas accéder à la section privée de la classe parent.

Nous pourrions peut-être rester simples et directs - regarder comment le nom de l'objet graphique est formé dans la classe CButton et travailler directement avec ces objets graphiques. D'autant plus qu'avec un bouton, cela devrait être facile, il n'a qu'un seul objet graphique.

 
TheXpert:

Yep, déjà deux personnes non connectées sont en train de photoshopper une croix de votre code ;)

Votre code ne peut pas fonctionner correctement - c'est évident à partir du code lui-même).

Deux personnes ? Sorti de ton imagination, hein ? Vous devriez au moins lire plus attentivement, ou au moins regarder les images plus attentivement. Le message du premier provient d'un débogueur. Il compile et fonctionne sans le débogueur.

 
Dmitry Fedoseev:

Deux personnes ? De ton imagination, hein ? Vous devriez lire plus attentivement, ou au moins regarder les images plus attentivement. Le premier message provient d'un débogueur. Sans débogueur, il compile et fonctionne.

Je l'ai fait planter sans débogueur).

il se bloque également dans le débogueur))

peut-être ne savez-vous pas où regarder dans le journal de sortie du script ? )))

 
TheXpert:

Je me plante sans débogueur)

Je suis aussi dans le débogueur).

peut-être que vous ne savez pas où voir le journal de sortie du script ? )))

Nan, je ne sais pas, dis-moi où c'est.

 
Vasiliy Pushkaryov:

Un conseil sur une autre question. Si vous créez une classe enfant CMyButton à partir de CButton, vous pouvez créer un bouton et modifier ensuite ses propriétés en dehors de la classe. Ci-dessous, cela est fait dans OnInit().

Mais si je veux créer des champs supplémentaires dans la classe enfant, et utiliser les propriétés intégrées de la classe CButton dans de nouvelles fonctions, comment cela peut-il être mis en œuvre correctement ?

Dans la classe CButton, le membre de la classe m_button est déclaré dans la section private.

Je pense que vous résolvez votre problème du côté de la "queue" encore une fois, je suggérerais de le résoudre de l'autre côté :

class CMyButton : public CButton
{ 
  private: 
   CButton        *mybtn;
  public: 
              CMyButton(void){}; 
             ~CMyButton(void){}; 
             
        bool    isPrevState;        // состояние кнопки на предыд.тике, true - была нажата     
        void    setButton();        // создаем кнопку
        void    setProp();          // задаем в ходе программы свойства
}; 

void CMyButton::setButton(void)
{
  mybtn = new CButton;
  mybtn.Create(....................);
  // как в этой функции создать кнопку? Я не могу вызвать метод Create()


Dmitry Fedoseev:

Vous ne pouvez pas accéder à la section privée de la classe mère.

vous pouvez entrer au moins avec #define et vous pouvez expérimenter avec dynamic_cast. l'année dernière j'ai étudié dynamic_cast et il fait des choses étonnantes, mais c'est un processus qui prend du temps


LeXpert:

Je l'ai obtenu sans débogueur)

vérifié - j'ai aussi obtenu : 2019.07.05 17:10:27.307 1 (EURUSD,H1) invalid pointer access in '1.mq5' (43,6)

 

Mais vous m'avez intrigué, alors j'ai pensé que peut-être je suis vraiment l'idiot que vous pensez que je suis. J'ai retrouvé un code que j'ai écrit il y a cinq ans, en voici un extrait :

Donc, vous pouvez garder... crachez votre... tout ce que tu veux... ...et rêver que je suis un idiot, mais pour l'instant c'est le contraire. Vous sautez partout comme des diables enragés et ça ne sert à rien.

***

Et avec mon code, malgré le fait qu'il compile et fonctionne, il devient rapidement clair qu'il y a quelque chose qui ne va pas. L'objet n'est pas supprimé par le biais de la suppression.

Mais vous aimez croire que je ne sais même pas quoi : CObj obj ; continuez à croire...

***

Mais ils sont prêts à se geler les oreilles jusqu'aux talons "pour contrarier leur grand-père". Même leur collecteur d'ordures est apparu dans MQL.

 
Dmitry Fedoseev:

Et tu m'as intrigué, alors j'ai pensé que peut-être je suis vraiment l'idiot que tu penses que je suis. J'ai retrouvé un code que j'ai écrit il y a cinq ans, en voici un extrait :

Donc, vous pouvez garder... crachez votre... tout ce que tu veux... et dire que je suis un idiot, mais jusqu'à présent, c'est le contraire.

Ici, tout est correct, la référence est à un pointeur, et celle qui cause toute l'agitation est une référence à un objet qui n'existe pas. Regardez attentivement le code.
 
Vladimir Simakov:
Tout est correct ici, le pointeur est référencé, alors que celui qui est à l'origine de toute la dispute est une référence à un objet qui n'existe pas. Regardez attentivement le code.

Vous pensez vraiment que je ne peux pas remarquer qu'il y a un * à un endroit et un * & à un autre ?

Et croyez-vous aussi que je ne sais pas ce qu'estCObj obj; ?

 
Vladimir Simakov:
...une référence à un objet qui n'existe pas...

Mais il compile et fonctionne.

 
Dmitry Fedoseev:

Vous pensez vraiment que je ne peux pas remarquer qu'il y a un * à un endroit et un * & à un autre ?

Et croyez-vous aussi que je ne sais pas ce qu'estCObj obj; ?

Tu l'as fait.
void z(CObj & o){
   o = new CObj();
}