기고글 토론 "MQL5 프로그래밍 기본: 목록" - 페이지 6

 
papaklass:

여러분, 실질적인 토론을 해보는 건 어떨까요? :)

올바른 시트는 임의의 클래스에 사용하기 위해 새 클래스를 명시적으로 구현할 필요가 없어야 합니다.

따라서 올바른 구현은 템플릿에 의존해야 합니다.

공정하게 말하자면, 제시된 템플릿 수준에서 이것이 실현 가능한지는 잘 모르겠습니다.

하지만 이는 사실 이 글의 문제와는 거리가 먼 이야기입니다.

 
TheXpert:


올바른 목록은 임의의 클래스에 사용하기 위해 새 클래스의 명시적인 구현이 필요하지 않아야 합니다...

노드(리스트 요소)의 유형과 연결 방식이 다르더라도 리스트는 동일한 구현, 즉 동일한 데이터 유형을 참조해야 한다는 것을 올바르게 이해했나요? 조건부로 CList는 다른 유형의 노드 (CSingleNode, CDoubleNode 등)를 포함해야 합니다...
 
denkir:
조건부로, CList에는 다양한 유형의 노드가 포함되어야 합니다....

왜 그럴까요? ) 컨테이너는 동질적인 객체들의 집합입니다.

객체 자체의 차이는 이미 객체 내에서 다형성을 통해 구현할 수 있으며 목록과는 관련이 없습니다.

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
TheXpert:

왜 그럴까요? ) 컨테이너는 동질적인 객체들의 집합입니다.

객체 자체의 차이는 이미 객체 내에서 다형성을 통해 구현할 수 있으며 목록과는 아무런 관련이 없습니다.

구체적인 목록에는 동질적인 노드가 포함된다는 것은 분명합니다. 제가 말하고자 하는 것은 그 목록의 노드 간의 관계가 다를 수 있으며, 각 노드 유형에 대해 다른 목록 유형이 필요하다는 것입니다. 서로 다른 유형의 노드에 대해 동일한 목록 클래스를 만들 수 있다면 좋을 것 같습니다.... 개인적으로 아직 직접 시도해보지 않았습니다..... 더 높은 수준의 추상화에 대해 생각해야 함.....
 
TheXpert:

올바른 시트는 임의의 클래스에 사용하기 위해 새 클래스를 명시적으로 구현할 필요가 없어야 합니다.

따라서 올바른 구현은 템플릿에 의존해야 합니다.

공정하게 말하자면, 제시된 템플릿 수준에서 이것이 실현 가능할지 확신할 수 없습니다.

하지만 이는 사실 이 글의 문제와는 거리가 먼 이야기입니다.

인정하기 싫지만 전문가가 바로 여기 있습니다. 이상적으로 리프 클래스는 템플릿에서 구현되어야 합니다. 표준 CList가 CObject에 구현되어 있긴 하지만요.
 

TheXpert가 제안하는 것은 분명한 같습니다.

그의 아이디어를 올바르게 이해한다면 일부 추상 목록의 모든 메서드는 "그" 노드를 자동으로 인식해야 합니다(이것은 다형성입니다).

예를 들어, 이 기사에는 CiSingleList(그림 9), CDoubleList(그림 11), CiUnrollDoubleList(그림 12), CiCircleDoubleList (그림 13)라는 사용자 클래스가 있습니다.

따라서 원칙적으로 모두 하나의 클래스에 넣을 수 있습니다. 하지만 특정 순간에 처리하는 노드 유형을 인식하도록 각 메서드를 코딩해야 합니다. 그리고 여기에도 리소스가 필요합니다... 모든 것이 명확하지는 않습니다....

Когда нужно использовать указатели в MQL5
Когда нужно использовать указатели в MQL5
  • 2010.03.25
  • MetaQuotes Software Corp.
  • www.mql5.com
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
 
가끔씩 정의가 승리하는 것을 보는 것은 좋은 일입니다. ))
 
denkir:
특정 목록에 동종 노드가 포함되어 있다는 것은 분명합니다. 제가 말한 것은 해당 목록의 노드 간의 관계가 다를 수 있으므로 각 유형의 노드에 대해 다른 목록 유형이 필요하다는 것입니다. 서로 다른 유형의 노드에 대해 동일한 목록 클래스를 만들 수 있다면 좋을 것 같습니다.... 개인적으로 아직 직접 시도해보지 않았습니다..... 더 높은 수준의 추상화에 대해 생각해야 함.....
노드 유형은 하나만 필요합니다. 표준 CObject의 구현과 CArray, CList, CTree 컬렉션의 구현은 MQL5 참조 --> 표준 라이브러리 --> 데이터 구성을 위한 클래스를 참조하세요.
Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 
...많은 작업이 필요합니다. 실제로 누가 저에게 보여줄까요?
 
denkir:

TheXpert가 제안하는 것은 분명한 같습니다.

그의 아이디어를 올바르게 이해한다면 일부 추상 목록의 모든 메서드는 "그" 노드를 자동으로 인식해야 합니다(이것은 다형성입니다).

예를 들어, 이 기사에는 CiSingleList(그림 9), CDoubleList(그림 11), CiUnrollDoubleList(그림 12), CiCircleDoubleList (그림 13)라는 사용자 클래스가 있습니다.

따라서 원칙적으로 모두 하나의 클래스에 넣을 수 있습니다. 하지만 특정 순간에 처리하는 노드 유형을 인식하도록 각 메서드를 코딩해야 합니다. 그리고 여기에도 리소스가 필요합니다... 모든 것이 명확하지는 않습니다...

무엇을 코딩해야 하나요?

#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>

enum ENUM_CLASS_TYPE
{
   HUMAN,
   ANIMAL,
   CAR
};

class Community : public CObject
{
   public:
      ENUM_CLASS_TYPE TypeCommunity(){return type;}
   protected:
      Community(ENUM_CLASS_TYPE cType)
      {
          type = cType;
      }
      
   private:
      ENUM_CLASS_TYPE type;
};

class Human : public Community
{
   public:
      Human() : Community(HUMAN){;}
      int IQ(){return 90;}
};

class Animal : public Community
{
   public:
      Animal() : Community(ANIMAL){;}
      int CountLegs(){return 4;}
};

class Car : public Community
{
   public:
      Car() : Community(CAR){;}
      int Speed(){return 20;}
};

void OnStart()
{
   CArrayObj elements;
   CObject* object = NULL;
   while(elements.Total() < 100)
   {
      switch(rand()%3)
      {
         
         case HUMAN:
            object = new Human();
            break;
         case ANIMAL:
            object = new Animal();
            break;
         case CAR:
            object = new Car();
            break;
      }
      elements.Add(object);
   }
   while(elements.Total() > 0)
   {
      Community* AnyObject = elements.At(0); 
      switch(AnyObject.TypeCommunity())
      {
         case HUMAN:
         {
            Human* human = AnyObject;
            printf("Element is Human, it's IQ is: " + (string)human.IQ());
            break;
         }
         case ANIMAL:
         {
            Animal* animal = AnyObject;
            printf("Element is anima, it has " + (string)animal.CountLegs() + " legs.");
            break;
         }
         case CAR:
         {
            Car* car = AnyObject;
            printf("Element is car. It has speed " + (string)car.Speed() + " km/h");
            break;
         }
      }
      elements.Delete(0);
   }
}
1학년, 2학기. 안타깝게도 MQL5는 유형 제어 기능이 매우 약하기 때문에 커뮤니티 중개자 없이는 할 수 없습니다. 하지만 EnumToString()과 같은 ClassToString 함수가 있었다면 모든 것을 훨씬 더 우아하고 쉽게 정리할 수 있었을 것입니다.