앗. 지원 질문

 

' OOP '라는 주제로 '좋다, 싫다' 등의 의견이 오갔다. 좀 더 일상적인 질문에 대한 답변을 원합니다.

질문은 ~이야. C ++ 교과서에서 나는 클래스의 인스턴스가 동시에 두 개의 다른 부모 클래스의 자식이 될 수 있다는 언급을 만났습니다.

 class A
{...}
class B
{...}
class C : public A : public B
{...}

또는 이와 유사한 것(원본을 찾을 수 없음). MQL5에서는 어떻습니까? 클래스가 동시에 두 개의 다른 부모 클래스의 자식이라고 선언할 수 있습니까? 구문은 무엇입니까?

핸드북의 문구 "다중 상속은 없습니다"는 그러한 상황에 대한 것이 아닙니까?

 
Yedelkin :

' OOP '라는 주제로 '좋다, 싫다' 등의 의견이 오갔다. 좀 더 일상적인 질문에 대한 답변을 원합니다.

질문은 ~이야. C ++ 교과서에서 나는 클래스의 인스턴스가 동시에 두 개의 다른 부모 클래스의 자식이 될 수 있다는 언급을 만났습니다.

또는 이와 유사한 것(원본을 찾을 수 없음). MQL5에서는 어떻습니까? 클래스가 동시에 두 개의 다른 부모 클래스의 자식이라고 선언할 수 있습니까? 구문은 무엇입니까?

핸드북의 문구 "다중 상속은 없습니다"는 그러한 상황에 대한 것이 아닙니까?

MQL5에서는 다중 상속이 지원되지 않지만 이와 같은 것을 구현할 수 있는 개체 포인터를 전달하는 흥미로운 메커니즘이 있습니다.

 

OOP를 사용하면 코드를 구조화하는 것이 매우 편리하다는 것이 밝혀졌습니다(진부함에 대해 죄송합니다). 당신은 방법을 하나씩 취하고 휘젓습니다. 매우 효율적이고 시각적입니다. 그러나 이러한 다중 래핑이 프로세서의 코드 처리 속도에 영향을 미치는지 의문이 생겼습니다. 특히 이 두 코드 옵션 간에 실행 속도에 차이가 있습니까?

 double ddd= 0.0 ;                   //первый вариант кода, инициализация без применения функций/методов
 

double ddd;                       //второй вариант кода, инициализация с применением функций/методов
void function( double a) { a= 0.0 ; }
...
function(ddd);

또는 컴파일 단계에서 코드가 인간에서 기계어로 변환되어 컴퓨터의 경우 이 두 옵션 모두 처리 속도 측면에서 다르지 않습니까?

 
Urain :

MQL5는 다중 상속을 지원하지 않습니다...

저것들. "다중 상속"- 이것이 복수의 부모입니까?

 
Yedelkin :
저것들. "다중 상속"- 이것이 복수의 부모입니까?

네, 부모가 1명일 수 있는 클래스입니다. 캐스케이딩은 가능하지만 2명의 부모와 mql5는 할 수 없습니다.

원칙적으로 상속 대신에 클래스 자체에서 "type as parent" 클래스를 호출하고 해당 포인터를 통해 "type as parent" 데이터에 액세스할 수 있습니다.

 
Urain :
네, 부모가 1명일 수 있는 클래스입니다. 캐스케이딩은 가능하지만 2명의 부모와 mql5는 할 수 없습니다.
알겠습니다. 즉시 용어의 의미를 찾아 추측하지 않았습니다.
 
Yedelkin :

이 코드는 다중 상속과 거의 다르지 않습니다.

 class C_A
  {
public :
                     C_A( void ){};
                    ~C_A( void ){};
   double             a;
  };
//+------------------------------------------------------------------+
class C_B
  {
public :
                     C_B( void ){};
                    ~C_B( void ){};
   double             b;
  };
//+------------------------------------------------------------------+
class C_C
  {
public :
   C_A              *ua;
   C_B              *ub;
                     C_C( void ){ua= new C_A();ub= new C_B();};
                    ~C_C( void ){ delete ua; delete ub;};
  };
//+------------------------------------------------------------------+
실제로 클래스 C_C는 해당 포인터를 통해 데이터 C_A 및 C_B에 액세스할 수 있습니다.
 
Urain :

이 코드는 다중 상속과 거의 다르지 않습니다.

실제로 클래스 C_C는 해당 포인터를 통해 데이터 C_A 및 C_B에 액세스할 수 있습니다.

시원한! 생성자에서 외부 클래스의 인스턴스를 만드는 것은 생각하지 않습니다. 도와 주셔서 감사합니다!

덧셈. 하지만 이 라인에서

C_C( void ){ua= new C_A();ub= new C_B();};

new 연산자는 C_A 클래스의 C_A() 생성자에 적용됩니다.

참고서에서 new 연산자의 피연산자는 생성자가 아니라 클래스 자체라는 것을 이해했습니다. 어떤 기능이 있을 수 있습니까?

 
그건 그렇고, 잠시 후 매개 변수가 생성자에 대해 작동하므로 개발자의 삶이 크게 단순화됩니다.
 
Renat :
그건 그렇고, 잠시 후 매개 변수가 생성자에 대해 작동하므로 개발자의 삶이 크게 단순화됩니다.
네, 기억합니다 :)
 
Yedelkin :

시원한! 생성자에서 외부 클래스의 인스턴스를 만드는 것은 생각하지 않습니다. 도와 주셔서 감사합니다!

덧셈. 하지만 이 라인에서

new 연산자는 C_A 클래스의 C_A() 생성자에 적용됩니다.

디렉토리에서 나는 new 연산자의 피연산자가 생성자가 아니라 클래스 자체라는 것을 이해했습니다. 어떤 기능이 있을 수 있습니까?

new 연산자 는 클래스의 인스턴스를 만들고 생성자 호출과 연결됩니다. 이것은 구문으로 작성되었으므로 달리 호출할 수 없습니다.

정적 광고에서는 모든 것이 자동으로 발생합니다.

이런 식으로, 그건 그렇고, 그것은 또한 작동하고 자동으로 파괴 될 것입니다

 class C_C
  {
public :
   C_A               ua;
   C_B               ub;
                     C_C( void ){};
                    ~C_C( void ){};
  };
//+------------------------------------------------------------------+
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5