기고글 토론 "MQL5에서 객체 포인터 사용" - 페이지 4

 
tol64:
보안 허점을 찾았나요? )
네. 그렇게 직접 캐스팅하는 것은 좋지 않습니다. 이 목적을 위해 특별히 dynamic_cast가 있는데, 여기서 완전히 올바르게 캐스팅 할 수 없으며 암시적이고 심각한 오류의 잠재적 인 소스입니다. 그리고 심각성 측면에서 볼 때 안전하지 않은 포인터와 참조보다 훨씬 낫지 않습니다.
 
denkir:

다형성을 사용하는 것이 더 낫지 않을까요?

대략 그렇습니다:

문제는 상속자 클래스인 CChartObjectRectLabel, CChartObjectButtonCChartObjectEdit에는 액세스해야 하는 고유한 메서드가 있다는 것입니다. 그리고 표준 라이브러리의 기본 클래스 CChartObject에는 동일한 가상 메서드가 없습니다.

 

위의 예시에서...

메서드에 액세스하는 방법은 무엇입니까?


...다음과 같이 밝혀졌습니다:

//--- objects[0]. // CChartObjectEdit 클래스의 메서드에 액세스하는 방법 ?
// 1.
   Print("((CChartObjectEdit *)objects[0]).BackColor(): ",((CChartObjectEdit *)objects[0]).BackColor());
//--- 2.
   CChartObjectEdit *e=(CChartObjectEdit *)objects[0];
   Print("e.BackColor(): ",e.BackColor());
   
//--- objects[1]. // CChartObjectButton 클래스의 메서드에 액세스하는 방법 ?
// 1.
   Print("((CChartObjectButton *)objects[1]).State(): ",((CChartObjectButton *)objects[1]).State());
//--- 2.
   CChartObjectButton *b=(CChartObjectButton *)objects[1];
   Print("b.State(): ",b.State());
   
//--- objects[2]. // CChartObjectRectLabel 클래스의 메서드에 액세스하는 방법은 무엇인가요?
// 1.
   Print("((CChartObjectRectLabel *)objects[2]).BackColor(): ",((CChartObjectRectLabel *)objects[2]).BackColor());
//--- 2.
   CChartObjectRectLabel *r=(CChartObjectRectLabel *)objects[2];
   Print("r.BackColor(): ",r.BackColor());
 
TheXpert:
네. 이렇게 직접 캐스팅하는 것은 정통적이지 않습니다. 플러스에는 특별히이 목적을 위해 dynamic_cast가 있으며, 여기에서는 완전히 올바르게 캐스팅 할 수 없으며 암시 적이고 심각한 오류의 잠재적 인 원인이됩니다. 그리고 진지하게 말하면 안전하지 않은 포인터와 참조보다 훨씬 낫지 않습니다.

예, 여기 포럼에서 질문하기 전에 인터넷에서 C ++에 dynamic_cast 연산자 ( 동적 데이터 식별 메커니즘)가 있다는 것을 발견했습니다.

이제 위의 링크를보고 있습니다:

// 동적 데이터 유형 식별 메커니즘은 다형성 데이터 유형에 대해서만 사용할 수 있습니다. 
// 클래스(즉, 가상 멤버 함수를 하나 이상 포함하는 클래스)

그래서 그것은 필수 조건입니까? 그리고 기본 클래스에 가상 메서드가 없으면 dynamic_cast가 작동하지 않습니까?

추신>>> 여기에서 dynamic_cast (MSDN)에 대해 자세히 읽고 있습니다.

 
TheXpert:
젠장, 그다음에 언어 안전성에 대해 이야기하는 건가요?

아마 C/C++에서처럼 무엇이든 자유롭게 캐스팅할 수 있다고 생각하실 겁니다.

그렇지 않으며 보안에는 아무런 문제가 없습니다.

 
Renat:

C/C++에서처럼 무엇이든 자유롭게 캐스팅할 수 있다고 생각할 수 있습니다.

그렇지 않으며 안전에는 아무런 문제가 없습니다.

나는 우연히 이 오류가 발생했고, 이는 당신의 말을 확인하는 것 같습니다. )

2014.11.06 14:33:36.588 OOP_Test (EURCHF,M5)   incorrect casting of pointers in 'Test1.mqh' (931,13)
 
Renat:

안전에는 아무런 문제가 없습니다.

아니요, 일반적으로 컴파일 타임 dynamic_cast 검사를 수행할 수 없습니다.
 
TheXpert:
아니요, 컴파일 타임에 dynamic_cast를 확인하는 것은 불가능합니다.

위의 코멘트는 런타임에 캐스팅 검사 결과를 보여줍니다.

고스트의 경우 누가 누구인지 정확히 알 수 있기 때문에 매우 엄격하며 RTTI 메커니즘에서 작동합니다.

 
Renat:

위의 댓글은 폭언에 대한 캐스팅 확인 결과를 보여줍니다.

Oops.... 혼란스러워요. 컴파일러인 줄 알았어요. 그럼 취소합니다.
 
이 튜토리얼을 통해 다형성을 명확하게 이해할 수 있었습니다. 고마워요