오류, 버그, 질문 - 페이지 1889

 

이것은 버그입니까 아니면 내가 뭔가를 이해하지 못하고 있습니까? 일반 포물선형 Expert Advisor는 스프레드를 고려하여 매수의 경우 마지막 지점에 정지 주문을 내립니다.
그리고 이제 가격(Ask)이 주문 57781의 가격에 도달했지만 주문이 열리지 않았습니다.

 
런타임 오류는 무엇입니까
 class CLASS1
{
public :
   int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart ()
{
  CLASS1 Object;
  CLASS2* Ptr = dynamic_cast <CLASS2*>(&Object);
  
  Ptr.i = 1 ;
}
 
fxsaber :
런타임 오류는 무엇입니까

다음과 같이 하면:

 class CLASS1
{
public :
   int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart ()
{
   CLASS2 Object;
   CLASS1 * Ptr = dynamic_cast < CLASS1 *>(&Object);
  
  Ptr.i = 1 ;
}

저것들. 부모에게 캐스트하면 모든 것이 올바르게 진행됩니다. 분명히 언어 구조에서 매우 중요한 변경이 발생했으며 이제 파생 유형은 확실히 조상 유형이 아닙니다.

C++에서 확인:

 class CLASS1
{
public :
   int i;  
};

class CLASS2 : public CLASS1 {};

void OnStart ()
{
  CLASS1* Object = new CLASS1();
  CLASS2* Ptr = (CLASS2 *)&Object;
  
  Ptr->i = 1 ;
}

부모 클래스의 객체를 파생 클래스의 유형으로 캐스팅하는 것은 올바르게 처리됩니다. 물론 그런 식으로 의도되지 않은 한 유형 캐스팅을 사용하는 MQL5 메커니즘의 일종의 오류입니다.

 
fxsaber :
런타임 오류는 무엇입니까

dynamic_cast가 반환하는 내용을 확인하지 않으면 이를 사용하는 것이 의미가 없습니다.

 
Konstantin :

다음과 같이 하면:

저것들. 부모에게 캐스트하면 모든 것이 올바르게 진행됩니다. 분명히 언어 구조에서 매우 중요한 변경이 발생했으며 이제 파생 유형은 확실히 조상 유형이 아닙니다.

부모로의 캐스팅은 고전적으로 dynamic_cast 없이도 MQL에서 항상 작동했습니다. 아마도 나는 dynamic_cast의 의미를 이해하지 못합니다. 설명서의 예에 따르면 의미를 이해하지 못했을 것입니다. 누가 설명해줄까?
 
Koldun Zloy :

dynamic_cast가 반환하는 내용을 확인하지 않으면 이를 사용하는 것이 의미가 없습니다.

고마워, 내 예에서는 NULL을 반환합니다. 왜 이런 일이 발생합니까?

이 기능을 사용하는 실제 예를 들어 주시겠습니까?


개발자는 다음과 같이 Graphic.mqh에서만 사용합니다.

      curve= dynamic_cast <CCurve*>(m_arr_curves.At(i));

       if ( CheckPointer (curve)!= POINTER_DYNAMIC )
         return ( false );

동시에 클래스/객체에 대한 이러한 정의가 있습니다.

 class CCurve : public CObject

CObject          *At( const int index) const ;

저것들. 그들은 부모 포인터를 자식으로 캐스팅합니다. 글쎄, 내 예에서 정확히 이것이 내가하는 일입니다! 걸림돌은 어디에 있습니까?

 

부모 클래스에 대한 포인터는 실제로 자식에 대한 포인터를 포함할 수 있습니다.

 class Class1
{
};

class Class2 : public Class1
{
};


Class1* a = new Class2();

Class2* b = dynamic_cast < Class2* >( a );

// b != NULL
 
Koldun Zloy :

부모 클래스에 대한 포인터는 실제로 자식에 대한 포인터를 포함할 수 있습니다.

고마워, 들어갔다!
 
fxsaber :
고마워, 들어갔다!

하지만 여전히 MQL에서 상속인 클래스의 포인터 유형에 대한 포인터를 캐스팅하는 것이 불가능한 이유를 이해하지 못하지만 C ++에서는 가능합니다. 그렇게 될래?

 
Konstantin :

C++에서는 가능합니다. MQL의 버그인지 설명해야 합니까?

C++에서는 기본 클래스에 대한 포인터가 자식을 가리키는 경우에만 가능합니다.