Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 245

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

Was ist hier los?
Wahrscheinlich sehen Sie sich alte Nachrichten an und sind zu faul, um weiterzuschauen.

Sorry, vielleicht weil Google automatisch übersetzt

 

Die Frage auf dem Bild lautet:

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 #:

Die Frage auf dem Bild lautet:

Code:

Forum über den Handel, automatisierte Handelssysteme und Testen von Handelsstrategien.

Merkmale der Sprache mql5, Feinheiten und Techniken der Arbeit

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();
}

Die Basisklasse hat keinen Zugriff auf die Felder der Nachkommen.

 
fxsaber #:

Die Basisklasse hat keinen Zugriff auf die Felder der Nachkommen.

Ja, aber ich habe es auf diese Weise besiegt:

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;
}
Dies ist eine funktionierende Version dessen, was erforderlich war.
 
Andrey Dik #:
ja, aber auf diese Weise besiegt:

ist eine funktionierende Version dessen, was benötigt wurde.
Sie ist sehr fehlerhaft.
In der OnStart-Methode sollten Sie einen Typ angeben, der nur in der Init-Methode der C_P-Klasse bekannt ist.
Ich denke, es ist besser, Deinit() für C_P hinzuzufügen.
 
Sergey Gridnev #:
Es ist sehr fehlerhaft.
In der Methode OnStart muss der Typ angegeben werden, der nur in der Methode Init der Klasse C_P bekannt ist.
Ich denke, es ist besser, Deinit() für C_P hinzuzufügen.
Zeigen Sie mir ein Beispiel, und jeder kann einen Künstler beleidigen)
 
Andrey Dik #:
Zeigen Sie mir ein Beispiel
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 #:
Zeigen Sie ein Beispiel, und jeder kann einen Künstler beleidigen).
Beispiel für was?
Wie kann man eine void Deinit(void)-Methode zu einer Klasse hinzufügen, die delete(a) aufruft, wenn a ein gültiger Zeiger auf ein Objekt ist?
Oder wie schreibt man ao.Deinit() in OnStart()?
;)
 
Sergey Gridnev #:
Beispiel für was?
Wie fügt man eine Methode void Deinit(void) zu einer Klasse hinzu, die delete(a) aufruft, wenn a ein gültiger Zeiger auf ein Objekt ist?
Oder wie schreibt man ao.Deinit() in OnStart()?
;)

Die Aufgabe bestand darin, Zugriff auf ein Objekt zu erhalten, nicht darin, das korrekte Löschen von Objekten zu organisieren. Löschen ist immer einfacher als Erstellen))

 
fxsaber #:
Danke, das ist sehr interessant.