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

 
Renat Fatkhullin :

틀림없이.

권리? dynamic_cast는 부모에서 자식으로 아래에서 위로 캐스팅하는 데 가장 자주 필요하기 때문입니다.

또한 MQL에서는 다음과 같은 경우에도 아래에서 위로 완벽하게 이어집니다.

 class A
{
public :
   virtual void f()
   {
       Print ( "1" );
   }
};

class B: public A
{
public :
   virtual void f()
   {
       Print ( "2" );
   }
};

void OnStart ()
{
   A* ptr1 = new B();
   ptr1.f();
   A* ptr2 = new A();
   ptr2.f();
   
   B* casted = dynamic_cast <B*>(ptr1);
   casted.f();
   
   B* casted1 = dynamic_cast <B*>(ptr2);
   casted1.f(); // здесь должна быть ошибка потому что casted1 должен быть null
   delete ptr1;
   delete ptr2;
}

вывод:
2017.05.13 18:30:14.864    t ETHUSD,M5: 2
2017.05.13 18:30:14.865    t ETHUSD,M5: 1
2017.05.13 18:30:14.866    t ETHUSD,M5: 2
2017.05.13 18:30:14.867    t ETHUSD,M5: 2


레나트 파트훌린 :

논의된 MQL5 코드 부분을 살펴보십시오.

예, 작동하지 않아야 하며 그 이유는 이미 위에서 설명했지만 아래에서 위로 캐스팅하는 것이 불가능하기 때문에 전혀 아닙니다.

 
Konstantin :
포인터를 위에서 아래로 캐스팅하면, 즉 부모에게, 그 후에 다른 범위의 스레드에 대한 포인터를 전달하면 하위 필드를 사용할 수 있습니까?

예, 다음은 귀하의 질문을 보여주는 예입니다.

 class CLASS1
  {
public :
   int                i;
  };
class CLASS2 : public CLASS1
  {
  };
void OnStart ()
  {
   CLASS1 _object;
   CLASS2 *_ptr= dynamic_cast <CLASS2 *>(&_object);

   if (!_ptr)
       Print ( "CLASS1 -> CLASS2 failed, null" );

   CLASS2 *my= new CLASS2;
   CLASS1 *my_ptr=my;
   CLASS2 *my_ptr2= dynamic_cast <CLASS2 *>(my_ptr);

   if (my_ptr2)
     {
       Print ( "CLASS2 -> CLASS1 -> CLASS2 ok" );
      my_ptr2.i= 1 ;
     }
   Print ( "Value: " ,my.i);
  }
및 출력:
 2017.05 . 13 18 : 34 : 50.341 cast (EURUSD,H1)        CLASS1 -> CLASS2 failed, null
2017.05 . 13 18 : 35 : 18.933 cast (EURUSD,H1)        CLASS2 -> CLASS1 -> CLASS2 ok
2017.05 . 13 18 : 35 : 20.110 cast (EURUSD,H1)        Value: 1

먼저 해결되지 않은 캐스팅을 아래에서 위로 확인하고 NULL을 얻습니다. 괜찮은.

그런 다음 우리는 CLASS2 객체를 생성하고 그것에 대한 참조를 부모 클래스에 할당합니다(여기서 역학에서 환경은 CLASS2 객체의 기본 유형이 메타 정보에 저장되어 있음을 알고 있음을 이해하는 것이 중요합니다). 다음으로 (귀하의 질문에 한함) CLASS1 링크에서 CLASS2로 동적으로 캐스트합니다(원본 개체의 메타 정보를 기반으로 변환 권한 확인 포함).

캐스팅 결과를 확인하고 변수 i = 1에 씁니다. 마지막에는 처음 생성된 객체 를 참조하여 i 값을 표시합니다.

모든 것이 사양에 따라 올바르게 작동합니다(C++ 자체 사양에 대한 dynamic_cast 포함).

 
Комбинатор :

권리? dynamic_cast는 부모에서 자식으로 아래에서 위로 캐스팅하는 데 가장 자주 필요하기 때문입니다.

또한 MQL에서는 다음과 같은 경우에도 아래에서 위로 완벽하게 이어집니다.

정확히:

최신 빌드로 업데이트하는 것을 잊지 마십시오. 저는 지금 1598에서 테스트 중입니다. 이 스레드는 최근에 이 스레드에서 zip 형식으로 게시되었습니다.

 
Renat Fatkhullin :

최신 빌드로 업데이트하는 것을 잊지 마십시오.

예, 오래된 빌드입니다.

레나트 파트훌린 :

맞습니다. 아래에서 위로 줄 수 없고 위에서 아래로만 줄 수 있습니다. 이것은 안전을 위한 것입니다.

이것을 문지르면 오해의 소지가 있으며 dynamic_cast의 기능과 직접적으로 모순됩니다.
 
Комбинатор :

예, 오래된 빌드입니다.

이것을 문지르면 오해의 소지가 있으며 dynamic_cast의 기능과 직접적으로 모순됩니다.

이마 캐스팅의 제기된 예의 일부로 CLASS1 -> CLASS2가 모든 것을 올바르게 말했습니다. 대부분의 경우 사람들이 머리에 가지고있는 것은이 캐스팅입니다.

또한 dynamic_cast 보안 검사의 기초가 되는 것은 정확히 "아래에서 위로 캐스팅할 수 없고 위에서 아래로만 캐스팅할 수 있음"입니다.

자신이 무엇을 하는지 아는 사람은 다이내믹 캐스팅의 본질을 이해합니다.

 
Renat Fatkhullin :

최신 빌드로 업데이트하는 것을 잊지 마십시오. 저는 지금 1598에서 테스트 중입니다. 이 스레드는 최근에 이 스레드에서 zip 형식으로 게시되었습니다.

컴파일러와 실행기는 어떤 exe 파일에 있습니까?

이제 MEb1599는 MT4b1080에 있습니다. metaeditor.exe와 terminal.exe가 하는 일을 설명해주세요.

 
fxsaber :

컴파일러와 실행기는 어떤 exe 파일에 있습니까?

이제 MEb1599는 MT4b1080에 있습니다. metaeditor.exe와 terminal.exe가 하는 일을 설명해주세요.

두 플랫폼의 컴파일러는 동일합니다. metaeditor.exe에 있습니다.
 
Renat Fatkhullin :
두 플랫폼의 컴파일러는 동일합니다. metaeditor.exe에 있습니다.
terminal.exe에서 동일한 dynamic_cast를 확인하는 실행기는 어떻습니까?
 
fxsaber :
terminal.exe에서 동일한 dynamic_cast를 확인하는 실행기는 어떻습니까?
틀림없이
 
Renat Fatkhullin :
이와 같은 또 다른 질문

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

오류, 버그, 질문

fxsaber , 2017.05.11 13:26

EX5가 왜 그런 코드입니까?
 void OnStart () {}

무게 5KB?