Questions sur la POO dans MQL5 - page 14

 
TheXpert:

est également sous la garde des modérateurs

Celui qui a dit quelque chose sur la garde... mais un personnage avec deux excentricités...

 
TheXpert:

également sous la tutelle des modérateurs

Je pensais avoir supprimé mon propre message.
 
Vladimir Simakov:
Il semble que j'ai supprimé mon propre message.

C'était le cas lorsqu'un objet est créé dans une fonction via new. À l'origine, nous avons parlé de passer un pointeur à un objet existant. Et ici, ça peut être passé comme ça :

void f(CObj * obj){}

 
Dmitry Fedoseev:

Et si un pointeur doit être transmis à une fonction pour créer un objet dans la fonction, c'est ainsi que cela fonctionne :

class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;

void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){
   o = new CObj();
}
C'est tout ce que vous vouliez savoir sur la POO, mais n'osiez pas le demander))).

Ce code fait sortir le terminal pour moi. Au mieux, cela provoque une erreur critique lors du débogage (pour une animation, cliquez sur l'image) :


Il est étrange qu'une telle construction soit ignorée par le compilateur.

 
Les gars, arrêtez de vous battre entre vous, surtout sur un terrain de jeu équitable.
Dmitry a donné le premier exemple avec une erreur, et qu'y a-t-il de mal à cela ?
Dim, oui il se compile sans erreur, mais lorsque vous exécutez le script, une erreur se produit.

Vladimir l'a corrigé et a ajouté un pointeur, le code a fonctionné correctement.
De quoi d'autre avons-nous besoin ? Maintenant nous devons trouver qui est le plus cool ? ))))
Les gars, soyez respectueux les uns des autres, et ne recourez pas aux personnalités et aux insultes avec arrogance.

Exemple initial de Dimitri
class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;


void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
Correction par Vladimir.
void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
Ma correction avec une impression du résultat de la méthode, pour vérifier
Cet exemple fonctionne maintenant, que vous faut-il de plus ?
Arrêtez de chercher à savoir qui est le plus cool ou pas, tout le monde a des fautes de frappe et des erreurs.
class CObj
{
   public:
   int f(){return(33);}
};

void z(CObj* &o)
{
   o = new CObj();
   Print(o.f());
}

CObj * obj;

//+------------------------------------------------------------------+
void OnStart()
{      
  z(obj);
  delete(obj);
}
Au cours de ces arguments, je pense que nous avons identifié une erreur de compilation.
Pourquoi le compilateur ne compile-t-il pas l'exemple initial de Dmitri sans erreur ?
 
Vasiliy Sokolov:

Ce code fait sortir le terminal pour moi. Au mieux, cela provoque une erreur de débogage critique:

Il est étrange qu'une telle construction soit acceptée par le compilateur.

Tout est valable pour le compilateur ici.

Un pointeur vers un objet dans le segment de données du programme est créé et est initié 0x0 pendant la compilation.

Les commandes nécessaires au processeur sont créées dans le segment de code.

Au moment de l'exécution, les commandes sont élevées sur la pile à l'adresse de la fonction z(...).

Et là, déplacer rdx [0x0]

Et l'accès à une adresse mémoire nulle est interdit. Le déréférencement d'un pointeur nul est appelé

 
Vladimir Simakov:
Tout est valable pour le compilateur ici.

Pour quel compilateur ?

 
Vasiliy Sokolov:

Ce code fait sortir le terminal pour moi. Au mieux, cela provoque une erreur critique lors du débogage (pour une animation, cliquez sur l'image) :


Il est étrange qu'une telle construction soit ignorée par le compilateur.

Le mien compile, fonctionne correctement, mais affiche un message de fuite de mémoire (delete doesn't work) à la fin du processus.

 
Igor Makanu:

Tu lui apprendras les mauvaises choses maintenant, c'est les bonnes choses qu'il faut régler ))))

#define private protected

Tu ne t'es pas assis sur les codes fxsaber pour rien. Ça ressemble à un chef-d'œuvre pour moi.

 

Je m'excuse pour la désinformation, j'ai écrit précédemment que vous ne pouvez pas appeler la méthode Create() dans une classe enfant.

Maintenant, après avoir vérifié deux fois, vous pouvez. Mais l'accès au membre privé m_button n'était pas disponible. C'est-à-dire qu'il était impossible de vérifier, par exemple, l'état d'un bouton : appuyé/relâché.

Maintenant, avec le conseil d'Igor, c'est possible.

#define private protected
#include <Controls\Button.mqh>

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

void CMyButton::setButton(void)
{
  // метод Create() вызывается
   Create(0, "setBtn", 0, 50, 300, 150, 325);
   Text("setBtn");
   
   m_button.State();     // работает когда включаем #define private protected
}
Raison: