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

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

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

C ++와 비교하는 것은 불가능합니다. 무엇이든 거기에 가져올 수 있습니다.

 
Комбинатор :
C++에서는 기본 클래스에 대한 포인터가 자식을 가리키는 경우에만 가능합니다.

나는 이것이 무엇을 의미하는지 이해하지 못하지만이 코드는 다음과 같습니다.

 class CLASS1
{
public :
   int i;  
};

class CLASS2 : public CLASS1 {};

int main () {
  CLASS1 _object;
  CLASS2 *_ptr = (CLASS2*)&_object;  
  _ptr->i = 1 ;

   return 0 ;
}

C++에서는 위에서 쓴 것처럼 작동합니다. 다음은 동일한 코드입니다(MQL 구문 고려).

 class CLASS1
{
public :
   int i;  
};

class CLASS2 : public CLASS1 {};

int OnInit () {
  CLASS1 _object;
  CLASS2 *_ptr = dynamic_cast <CLASS2 *>(&_object);
  
  _ptr.i = 1 ;

   return 0 ;
}
더 이상 작동하지 않기 때문에 _ptrNULL 을 얻습니다.
따라서 질문이 발생합니다. 이것이 MQL 버그이며 수정될 것입니까, 아니면 모든 것이 이대로 유지될 것입니까?
 
Renat Fatkhullin :

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

C ++와 비교하는 것은 불가능합니다. 무엇이든 거기에 가져올 수 있습니다.


이제 이해가 되네요 설명 감사합니다 :)
 
Konstantin :

나는 이것이 무엇을 의미하는지 이해하지 못하지만이 코드는 다음과 같습니다.

글쎄, 이해하려고. 먼저 dynamic_cast가 플러스에서 작동하도록 합니다. 스스로 알아내십시오. 훨씬 나아질 것입니다.
 
Renat Fatkhullin :

맞습니다. 아래에서 위로 줄 수 없고 위에서 아래로만 줄 수 있습니다.

어떤 의미에서 기본 클래스에서 자손으로 생성하는 것은 불가능합니까?
 
Комбинатор :
어떤 의미에서 기본 클래스에서 자손으로 생성하는 것은 불가능합니까?

예, 실제로 구성된 어린이가 바닥에 누워 있지 않은 경우.

 
Renat Fatkhullin :

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

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

네.

레나트, dynamic_cast가 무엇인지 아십니까?
 
Комбинатор :
레나트, dynamic_cast가 무엇인지 아십니까?

틀림없이.

논의된 MQL5 코드 부분을 살펴보십시오. 기본 인스턴스가 생성된 다음 보안 시스템을 위반하여 캐스트 스피커를 통해 영웅적으로 후손으로 변환하려고 합니다. 물론 꽝입니다.

 

문서에서 직접 동일한 예가 고려되고 설명됩니다. 런타임 시 동적 캐스팅은 보안 및 유효성 검사를 통과한 후에만 트리거됩니다. 각 MQL5 개체에는 런타임에 권한을 확인하기 위한 모든 메타 정보가 있습니다. 그것은 빈 C++가 아닙니다.


dynamic_cast 연산자를 사용한 동적 유형 캐스팅

클래스 포인터에만 적용할 수 있는 dynamic_cast 연산자를 사용하여 동적 유형 캐스팅의 가능성이 있습니다. 이 경우 프로그램 실행 시 유형의 정확성을 검사합니다. 이것은 dynamic_cast 연산자를 사용할 때 컴파일러가 캐스트에 사용된 데이터 유형을 확인하지 않음을 의미합니다. 포인터가 객체의 실제 유형이 아닌 데이터 유형으로 변환되는 경우 결과는 NULL입니다.

dynamic_cast <유형 ID>(표현식)

꺾쇠 괄호 안의 type-id 매개변수 는 이전에 정의된 클래스 유형에 대한 포인터여야 합니다. 피연산자 유형 표현식 (C++과 달리)은 void를 제외한 모든 것이 될 수 있습니다.

예시:

클래스 CBar { };
클래스 CFoo : 공개 CBar { };
 
무효의   시작 ()
{
C바 바;
//--- *bar 포인터 유형을 *foo 포인터로 동적으로 캐스팅할 수 있습니다.
CFoo *foo = dynamic_cast <CFoo *>(&bar); // 치명적인 런타임 오류가 발생하지 않습니다.
    인쇄 (foo); // foo=NULL
//--- Bar 유형의 객체 참조를 Foo 유형의 객체로 명시적으로 캐스트하려는 시도는 금지됩니다.
foo=(CFoo*)&bar; // 치명적인 런타임 오류가 발생합니다.
    인쇄 (foo); // 이 라인은 실행되지 않습니다.
}