Características del lenguaje mql5, sutilezas y técnicas - página 245

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

¿Qué pasa aquí?
Probablemente estás viendo mensajes antiguos y te da pereza mirar hacia delante.

Lo sentimos, tal vez porque google auto traducir

 

La pregunta de la imagen es:

código:
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 pregunta de la imagen es:

código:

Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.

Características del lenguaje mql5, sutilezas y técnicas de trabajo

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 clase base no tiene acceso a los campos de los descendientes.

 
fxsaber #:

La clase base no tiene acceso a los campos descendientes.

Sí, pero lo derroté de esta manera:

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;
}
esta es una versión funcional de lo que se requería.
 
Andrey Dik #:
sí, pero derrotado de esta manera:

es una versión de trabajo de lo que se requería.
Es muy buggy.
En el método OnStart debe especificar un tipo que sólo se conoce en el método Init de la clase C_P.
Creo que es mejor añadir Deinit() para C_P.
 
Sergey Gridnev #:
Es muy buggy.
En el método OnStart es necesario especificar el tipo que sólo se conoce en el método Init de la clase C_P.
Creo que es mejor añadir Deinit() para C_P.
Muéstrame un ejemplo, y cualquiera puede ofender a un artista)
 
Andrey Dik #:
Muéstreme un ejemplo
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 #:
Muestra un ejemplo, y cualquiera puede ofender a un artista).
¿Ejemplo de qué?
¿Cómo añadir un método void Deinit(void) a una clase que llama a delete(a) si a es un puntero válido a un objeto?
¿O cómo escribir ao.Deinit() en OnStart()?
;)
 
Sergey Gridnev #:
¿Ejemplo de qué?
¿Cómo se añade un método void Deinit(void) a una clase que llama a delete(a) si a es un puntero válido a un objeto?
¿O cómo escribir ao.Deinit() en OnStart()?
;)

La tarea era obtener acceso a un objeto, no organizar el borrado correcto de objetos. Borrar siempre es más fácil que crear))

 
fxsaber #:
Gracias, es interesante.