Caractéristiques du langage mql5, subtilités et techniques - page 245

 
Nikolai Semko # : https://www.mql5.com/ru/forum/170952/page243#comment_52244665

Qu'est-ce qui ne va pas ici ?
Vous regardez probablement d'anciens messages et êtes trop paresseux pour regarder devant vous.

Désolé, peut-être à cause de la traduction automatique de google

 

La question posée dans l'image est la suivante :

code :
class C_AO_Agent
{
public:
    double c[];
    double f;
};

class C_AO
{
public:
    double cB[];
     C_AO_Agent *a;

    virtual void Init() { }
};

class C_Agent : public C_AO_Agent
{
public:
    double g;
    
    class ad
    {
    
    };
};

class C_P : public C_AO
{
public:
    void Init()
    {
      a = new C_Agent;
      a.f = 5;
    }
};

void OnStart()
{
    C_AO *ao;
    ao = new C_P;
    ao.Init();
}
 
Andrey Dik #:

La question posée dans l'image est la suivante :

code :

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading.

Caractéristiques du langage mql5, subtilités et techniques de travail

Andrey Dik, 2024.02.16 06:05

class C_AO_Agent
{
public:
    double c[];
    double f;
};

class C_AO
{
public:
    double cB[];
     C_AO_Agent *a;

    virtual void Init() { }
};

class C_Agent : public C_AO_Agent
{
public:
    double g;
    
    class ad
    {
    
    };
};

class C_P : public C_AO
{
public:
    void Init()
    {
      a = new C_Agent;
      a.f = 5;
    }
};

void OnStart()
{
    C_AO *ao;
    ao = new C_P;
    ao.Init();
}

La classe de base n'a pas accès aux champs des descendants.

 
fxsaber #:

La classe de base n'a pas accès aux champs descendants.

Oui, mais je l'ai défait de cette façon :

class C_AO_Agent
{
public:
    double c;
    double f;
};

class C_AO
{
public:
    double cB[];
     C_AO_Agent *a;

    virtual void Init() { }
};

class C_Agent : public C_AO_Agent
{
public:
    double g;
    
    class ad
    {
    
    };
};

class C_P : public C_AO
{
public:
    void Init()
    {
      a = new C_Agent;
      C_Agent *agent = (C_Agent*)a; // Приведение типов
      agent.f  = 5;
      agent.g  = 7;                 //теперь есть доступ к g!!!
      agent.c  = 8;
    }
};

void OnStart()
{
    C_AO *ao;
    ao = new C_P;
    ao.Init();
    
    //тут нам нужен доступ только к f и c
    Print (ao.a.f);
    Print (ao.a.c);
    
    // Удаление объектов
    delete ((C_Agent*)ao.a);
    delete ao;
}
il s'agit d'une version fonctionnelle de ce qui était nécessaire.
 
Andrey Dik #:
Oui, mais défait de cette manière :

est une version fonctionnelle de ce qui était requis.
Elle est très boguée.
Dans la méthode OnStart, vous devez spécifier un type qui n'est connu que dans la méthode Init de la classe C_P.
Je pense qu'il est préférable d'ajouter Deinit() pour C_P.
 
Sergey Gridnev #:
C'est très bogué.
Dans la méthode OnStart, il est nécessaire de spécifier le type qui n'est connu que dans la méthode Init de la classe C_P.
Je pense qu'il est préférable d'ajouter Deinit() pour C_P.
Montrez-moi un exemple, et tout le monde peut offenser un artiste)
 
Andrey Dik #:
Montrez-moi un exemple
class C_AO_Agent
{
public:
    double c;
    double f;
};

class C_AO
{
public:
    double cB[];
     C_AO_Agent *a;

  C_AO( void ) : a(NULL) {}
  
  ~C_AO( void )
  {
    this.Init();
  }

    virtual void Init()
    {
      if (::CheckPointer(this.a) == POINTER_DYNAMIC)
        delete this.a;
    }
};

class C_P : public C_AO
{
protected:
  class C_Agent : public C_AO_Agent
  {
  public:
      double g;
      
      class ad
      {
      
      };
  } *agent;
  
public:
    C_P( void ) : agent(NULL) {}
    
    virtual void Init()
    {
      this.C_AO::Init();
            
      this.agent = new C_Agent;
      this.a = this.agent;
    }
};

void OnStart()
{
    C_AO *ao;
    ao = new C_P;
    ao.Init();
    
    //тут нам нужен доступ только к f и c
    Print (ao.a.f);
    Print (ao.a.c);
    
    // Удаление объектов
    delete ao;
}
 
Andrey Dik #:
Montrez un exemple, et n'importe qui peut offenser un artiste).
Un exemple de quoi ?
Comment ajouter une méthode void Deinit(void) à une classe qui appelle delete(a) si a est un pointeur valide vers un objet ?
Ou comment écrire ao.Deinit() dans OnStart() ?
;)
 
Sergey Gridnev #:
Exemple de quoi ?
Comment ajouter une méthode void Deinit(void) à une classe qui appelle delete(a) si a est un pointeur valide vers un objet ?
Ou comment écrire ao.Deinit() dans OnStart() ?
;)

La tâche était d'obtenir l'accès à un objet, pas d'organiser la suppression correcte d'objets. La suppression est toujours plus facile que la création))

 
fxsaber #:
Merci, c'est intéressant.