앗. 지원 질문 - 페이지 7

 
equivalent23 :

틀림없이:

나는 CShape 에서 파생된 클래스의 인스턴스로 shape[10] 배열 을 올바르게 채우는 방법이 문제라는 것을 깨달았습니다. 어떤 이유로 내 제안이 작동하지 않습니다. 생각 해봐.
 
Yedelkin :
나는 CShape 에서 파생된 클래스의 인스턴스로 shape[10] 배열 을 올바르게 채우는 방법이 문제라는 것을 깨달았습니다. 어떤 이유로 내가 제안한 솔루션이 작동하지 않습니다. 생각 해봐.

배열은 클래스 자체의 유형이 아니라 클래스에 대한 포인터 유형이어야 합니다.

그런 다음 new 연산자 를 사용할 수 있습니다.

Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
Документация по MQL5: Основы языка / Операторы / Оператор создания объекта new
  • www.mql5.com
Основы языка / Операторы / Оператор создания объекта new - Документация по MQL5
 
AlexSTAL :

배열은 클래스 자체의 유형이 아니라 클래스에 대한 포인터 유형이어야 합니다.

그런 다음 새 연산자 를 사용할 수 있습니다.

예를 들어도 될까요?

내가 준 예는 문서에서 가져온 것이며 어떻게 작동해야하는지 명확하지 않습니다 ...

 
Yedelkin :
나는 CShape 에서 파생된 클래스의 인스턴스로 shape[10] 배열 을 올바르게 채우는 방법이 문제라는 것을 깨달았습니다. 어떤 이유로 내가 제안한 솔루션이 작동하지 않습니다. 생각 해봐.

생각하지 마십시오. 100루블은 돈이 아닙니다.

이 예제는 100% 버그가 있으며 그러한 구현은 고려되지 않았거나 끝까지 완료되지 않았습니다.

나는 코드에서 내 실험의 결과를 제공하지 않고 현재 결론을 제시할 것이며 다음과 같습니다.

1. 객체를 클래스가 아닌 구조체로 선언하면 배열에 쉽게 들어 맞습니다. 이 경우에만 가상을 제거해야 하며 배열 에 있는 개체 유형 (이 경우 기본 클래스)의 기능으로만 작업할 수 있습니다.

2. 둘 다 포인터로 선언할 수 있으며 배열을 구성할 수도 있지만 여기에도 문제가 있습니다.

a) 포인터를 청소하지 않으면 메모리 누수가 나타납니다.

b) 자손의 기능으로 정상적으로 작동하는 것도 불가능합니다.

추신

오히려 기본 클래스에서 선언된 기능은 사용 가능하지만 자손에서도 볼 수 있지만 자손 자체에 나타난 모든 기능은 사용할 수 없습니다.

Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Свойства объектов - Документация по MQL5
 
AlexSTAL :

배열은 클래스 자체의 유형이 아니라 클래스에 대한 포인터 유형이어야 합니다.

그런 다음 new 연산자 를 사용할 수 있습니다.

예, 포인터의 사용에 대해서도 이 방향으로 생각했습니다. 그러나 문서의 조건이 충족되지 않습니다.

" 정사각형(클래스 CSquare)의 경우 면적은 측면으로 계산되고, 원(클래스 CCircle )의 경우 면적은 반지름 등으로 표현됩니다. 후손. 미래에 동일한 기능을 호출할 수 있습니다. 이 배열의 모든 요소.

... 정사각형과 원의 면적을 계산하려면 m_radius 및 m_square_side 멤버의 해당 값이 필요하므로 해당 클래스의 선언에 SetRadius 및 SetSide() 함수를 추가했습니다. 이제 Shape 유형의 배열을 선언하고 파생 클래스 개체로 채울 수 있습니다 ..."

 
AlexSTAL :

배열은 클래스 자체의 유형이 아니라 클래스에 대한 포인터 유형이어야 합니다.

그런 다음 새 연산자 를 사용할 수 있습니다.

잘 실행되지 않습니다. 배열이 형성되지만.

예델킨 :

... 정사각형과 원의 면적을 계산하려면 m_radius 및 m_square_side 멤버의 해당 값이 필요하므로 해당 클래스의 선언에 SetRadius 및 SetSide() 함수를 추가했습니다. 이제 Shape 유형의 배열을 선언하고 파생 클래스 개체로 채울 수 있습니다..."

전체 트릭은 배열에 기본 클래스 유형이 있으면 하위 항목의 기능에 액세스할 수 없다는 것입니다. 저것들. SetRadius() 및 SetSide()는 더 이상 사용할 수 없습니다.

그래서 지금까지 세 가지 옵션이 표시됩니다.

1. 어레이는 균질해야 합니다(가능한 경우).

2. MQL5용 OOP의 철학과 아키텍처를 이해하지 못합니다.

3. 개발자가 작동하지 않는 예제를 다시 확인하거나 질문을 완료하지 않았습니다.>

 
Interesting :
잘 실행되지 않습니다. 배열이 형성되지만.
정상적으로 실행되지 않는다는 것은 무엇을 의미합니까?
 
Interesting :

오히려 기본 클래스에서 선언된 기능은 사용할 수 있지만 하위 클래스에서는 볼 수 있지만 하위 클래스에서 나타나는 모든 기능은 사용할 수 없습니다 .

와우, 내가 만난 것이 바로 그것입니다.

흥미로운 :

예제는 100% 버그입니다...

이 주제에 대한 핸드북 저자의 답변이 필요합니다.

 
Interesting :
잘 실행되지 않습니다. 배열이 형성되지만.

전체 트릭은 배열에 기본 클래스 유형이 있으면 하위 항목의 기능에 액세스할 수 없다는 것입니다. 저것들. SetRadius() 및 SetSide()는 더 이상 사용할 수 없습니다.

그래서 지금까지 세 가지 옵션이 표시됩니다.

1. 어레이는 균질해야 합니다(가능한 경우).

2. MQL5용 OOP의 철학과 아키텍처를 이해하지 못합니다.

3. 개발자가 작동하지 않는 예제를 다시 확인하거나 질문을 완료하지 않았습니다.>

하다:

 class CBase
  {
public :
   void m_radius() { Print ( "CBase" );}
  };

class CTest : public CBase
  {
public :
   void m_radius() { Print ( "CTest" );}
  };

CBase* Base;

void OnStart ()
  {
   Base = new CTest;
   Base.m_radius();
   ((CTest *)Base).m_radius();
   delete Base;
  }

가상화를 통해 훨씬 쉽게 만들 수 있습니다.

 class CBase
  {
public :
   virtual void m_radius() { Print ( "CBase" );}
  };

class CTest : public CBase
  {
public :
   virtual void m_radius() { Print ( "CTest" );}
  };

CBase* Base;

void OnStart ()
  {
   Base = new CTest;
   Base.m_radius();
   delete Base;
  }
 
AlexSTAL :
정상적으로 실행되지 않는다는 것은 무엇을 의미합니까?

1. 자손의 기능을 사용할 수 없습니다. 누가, 어떻게 했는지는 모르겠으나 개인적으로 Array에서 SetRadius(), SetSide()에 접근하지 못해서 autogen으로 문제를 해결할 수 있는 방법이 있을지도 모르지만, 없으면 좋겠다.

2. 이 방법으로 포인터로 작업하지 않을 수도 있지만 항상 누수가 발생하거나 주요 작업이 진행 중인 블록에서 포인터를 바로 맞아야 합니다.