Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
객체 자체의 차이는 이미 객체 내에서 다형성을 통해 구현할 수 있으며 목록과는 아무런 관련이 없습니다.
구체적인 목록에는 동질적인 노드가 포함된다는 것은 분명합니다. 제가 말하고자 하는 것은 그 목록의 노드 간의 관계가 다를 수 있으며, 각 노드 유형에 대해 다른 목록 유형이 필요하다는 것입니다. 서로 다른 유형의 노드에 대해 동일한 목록 클래스를 만들 수 있다면 좋을 것 같습니다.... 개인적으로 아직 직접 시도해보지 않았습니다..... 더 높은 수준의 추상화에 대해 생각해야 함.....
Все объекты в MQL5 по умолчанию передаются по ссылке, но есть возможность использовать и указатели объектов. При этом есть опасность получить в качестве параметра функции указатель неинициализированного объекта. В этом случае работа программы будет завершена критически с последующей выгрузкой. Автоматически создаваемые объекты как правило такой ошибки не вызывают, и в этом отношении они достаточно безопасны. В этой статье мы попробуем разобраться в чем разница между ссылкой и указателей, когда оправдано использование указателей и как написать безопасный код с использованием указателей.
denkir: 특정 목록에 동종 노드가 포함되어 있다는 것은 분명합니다. 제가 말한 것은 해당 목록의 노드 간의 관계가 다를 수 있으므로 각 유형의 노드에 대해 다른 목록 유형이 필요하다는 것입니다. 서로 다른 유형의 노드에 대해 동일한 목록 클래스를 만들 수 있다면 좋을 것 같습니다.... 개인적으로 아직 직접 시도해보지 않았습니다..... 더 높은 수준의 추상화에 대해 생각해야 함.....
노드 유형은 하나만 필요합니다. 표준 CObject의 구현과 CArray, CList, CTree 컬렉션의 구현은 MQL5 참조 --> 표준 라이브러리 --> 데이터 구성을 위한 클래스를 참조하세요.
그의 아이디어를 올바르게 이해한다면 일부 추상 목록의 모든 메서드는 "그" 노드를 자동으로 인식해야 합니다(이것은 다형성입니다).
예를 들어, 이 기사에는 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(){return90;}
};
class Animal : public Community
{
public:
Animal() : Community(ANIMAL){;}
int CountLegs(){return4;}
};
class Car : public Community
{
public:
Car() : Community(CAR){;}
int Speed(){return20;}
};
voidOnStart()
{
CArrayObj elements;
CObject* object = NULL;
while(elements.Total() < 100)
{
switch(rand()%3)
{
case HUMAN:
object = new Human();
break;
caseANIMAL:
object = new Animal();
break;
caseCAR:
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 함수가 있었다면 모든 것을 훨씬 더 우아하고 쉽게 정리할 수 있었을 것입니다.
여러분, 실질적인 토론을 해보는 건 어떨까요? :)
올바른 시트는 임의의 클래스에 사용하기 위해 새 클래스를 명시적으로 구현할 필요가 없어야 합니다.
따라서 올바른 구현은 템플릿에 의존해야 합니다.
공정하게 말하자면, 제시된 템플릿 수준에서 이것이 실현 가능한지는 잘 모르겠습니다.
하지만 이는 사실 이 글의 문제와는 거리가 먼 이야기입니다.
올바른 목록은 임의의 클래스에 사용하기 위해 새 클래스의 명시적인 구현이 필요하지 않아야 합니다...
조건부로, CList에는 다양한 유형의 노드가 포함되어야 합니다....
왜 그럴까요? ) 컨테이너는 동질적인 객체들의 집합입니다.
객체 자체의 차이는 이미 객체 내에서 다형성을 통해 구현할 수 있으며 목록과는 관련이 없습니다.
왜 그럴까요? ) 컨테이너는 동질적인 객체들의 집합입니다.
객체 자체의 차이는 이미 객체 내에서 다형성을 통해 구현할 수 있으며 목록과는 아무런 관련이 없습니다.
올바른 시트는 임의의 클래스에 사용하기 위해 새 클래스를 명시적으로 구현할 필요가 없어야 합니다.
따라서 올바른 구현은 템플릿에 의존해야 합니다.
공정하게 말하자면, 제시된 템플릿 수준에서 이것이 실현 가능할지 확신할 수 없습니다.
하지만 이는 사실 이 글의 문제와는 거리가 먼 이야기입니다.
TheXpert가 제안하는 것은 분명한 것 같습니다.
그의 아이디어를 올바르게 이해한다면 일부 추상 목록의 모든 메서드는 "그" 노드를 자동으로 인식해야 합니다(이것은 다형성입니다).
예를 들어, 이 기사에는 CiSingleList(그림 9), CDoubleList(그림 11), CiUnrollDoubleList(그림 12), CiCircleDoubleList (그림 13)라는 사용자 클래스가 있습니다.
따라서 원칙적으로 모두 하나의 클래스에 넣을 수 있습니다. 하지만 특정 순간에 처리하는 노드 유형을 인식하도록 각 메서드를 코딩해야 합니다. 그리고 여기에도 리소스가 필요합니다... 모든 것이 명확하지는 않습니다....
특정 목록에 동종 노드가 포함되어 있다는 것은 분명합니다. 제가 말한 것은 해당 목록의 노드 간의 관계가 다를 수 있으므로 각 유형의 노드에 대해 다른 목록 유형이 필요하다는 것입니다. 서로 다른 유형의 노드에 대해 동일한 목록 클래스를 만들 수 있다면 좋을 것 같습니다.... 개인적으로 아직 직접 시도해보지 않았습니다..... 더 높은 수준의 추상화에 대해 생각해야 함.....
TheXpert가 제안하는 것은 분명한 것 같습니다.
그의 아이디어를 올바르게 이해한다면 일부 추상 목록의 모든 메서드는 "그" 노드를 자동으로 인식해야 합니다(이것은 다형성입니다).
예를 들어, 이 기사에는 CiSingleList(그림 9), CDoubleList(그림 11), CiUnrollDoubleList(그림 12), CiCircleDoubleList (그림 13)라는 사용자 클래스가 있습니다.
따라서 원칙적으로 모두 하나의 클래스에 넣을 수 있습니다. 하지만 특정 순간에 처리하는 노드 유형을 인식하도록 각 메서드를 코딩해야 합니다. 그리고 여기에도 리소스가 필요합니다... 모든 것이 명확하지는 않습니다...
무엇을 코딩해야 하나요?
1학년, 2학기. 안타깝게도 MQL5는 유형 제어 기능이 매우 약하기 때문에 커뮤니티 중개자 없이는 할 수 없습니다. 하지만 EnumToString()과 같은 ClassToString 함수가 있었다면 모든 것을 훨씬 더 우아하고 쉽게 정리할 수 있었을 것입니다.