mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 245

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

무슨 문제인가요?
오래된 메시지를 보고 있는데 너무 게을러서 앞을 보지 못하는 것일 수 있습니다.

죄송합니다. Google 자동 번역 때문에

 

사진의 질문은 다음과 같습니다:

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

사진의 질문은 다음과 같습니다:

코드:

거래, 자동 거래 시스템 및 테스트 거래 전략에 관한 포럼.

mql5 언어의 특징, 미묘함 및 작업 기술

안드레이 딕, 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();
}

기본 클래스는 자손 필드에 액세스할 수 없습니다.

 
fxsaber #:

기본 클래스에는 하위 필드에 대한 액세스 권한이 없습니다.

예, 하지만 다음과 같은 방법으로 해결했습니다:

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;
}
이것은 필요한 것의 작동 버전입니다.
 
Andrey Dik #:
예, 하지만 다음과 같은 방법으로 패배했습니다:

필요한 것의 작동 버전입니다.
매우 버그가 많습니다.
OnStart 메서드에서 C_P 클래스의 Init 메서드에서만 알려진 유형을 지정해야합니다.
C_P에 Deinit()을 추가하는 것이 더 낫다고 생각합니다.
 
Sergey Gridnev #:
매우 버그가 많습니다.
OnStart 메서드에서 C_P 클래스의 Init 메서드에서만 알 수 있는 유형을 지정해야 합니다.
C_P에 Deinit()을 추가하는 것이 더 낫다고 생각합니다.
예제를 보여 주시면 누구나 아티스트의 기분을 상하게 할 수 있습니다.)
 
Andrey Dik #:
예제 보기
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 #:
예를 보여 주면 누구나 아티스트의 기분을 상하게 할 수 있습니다).
어떤 예시요?
a가 객체에 대한 유효한 포인터인 경우 delete(a)를 호출하는 클래스에 void Deinit(void) 메서드를 추가하는 방법은 무엇인가요?
또는 OnStart()에서 ao.Deinit()을 작성하는 방법은 무엇인가요?
;)
 
Sergey Gridnev #:
어떤 예시인가요?
a가 객체에 대한 유효한 포인터인 경우 delete(a)를 호출하는 클래스에 void Deinit(void) 메서드를 추가하려면 어떻게 해야 하나요?
또는 OnStart()에 ao.Deinit()을 작성하는 방법은 무엇인가요?
;)

이 작업은 객체에 대한 액세스 권한을 얻는 것이지 객체를 올바르게 삭제하는 것이 아닙니다. 삭제는 항상 생성보다 쉽습니다.)

 
fxsaber #:
감사합니다, 흥미롭네요.