예전에는 가능했나요?
저녁에는 C ++에서 이러한 선언을 사용하여 방법을 확인할 것입니다.
Vladimir Simakov :
예전에는 가능했나요?
예전에는 가능했나요?
네. 이전 빌드(1554)에서 특별히 확인했습니다. 모든 것이 작동합니다.
저녁에는 C ++에서 이러한 선언을 사용하여 방법을 확인할 것입니다.
Alexey Navoykov :
이 구성을 사용하는 예를 제공하십시오.
fxsaber :
이 구성을 사용하는 예를 제공하십시오.
가장 평범한 예는 배열 클래스입니다. 이 경우 포인터를 저장하는 데 사용됩니다.
template < typename T> class CArray { T _data[]; public : T operator []( int i) const { return _data[i]; } int Size() const { return ArraySize (_data); } // и т.д. }; СArray< void *> pointers;
Alexey Navoykov :
가장 평범한 예는 배열 클래스입니다. 이 경우 포인터를 저장하는 데 사용됩니다.
그럼 어떻게 사용할까요?
class A { public : void OnInit () { Print ( __FUNCSIG__ ); } }; class B { public : void OnInit () { Print ( __FUNCSIG__ ); } }; void OnStart () { void * Pointers[ 2 ]; A a; B b; Pointers[ 0 ] = &a; Pointers[ 1 ] = &b; for ( int i = 0 ; i < ArraySize (Pointers); i++) Pointers[i]. OnInit (); // 'OnInit' - member function not defined }
Alexey Navoykov :
원래 거기에 넣은 유형으로 캐스트합니다(또는 dynamic_cast를 통해 확인).
원래 거기에 넣은 유형으로 캐스트합니다(또는 dynamic_cast를 통해 확인).
// (A*)Pointers[i].OnInit(); ((A*)Pointers[i]). OnInit ();
이것은 대괄호의 필요성/무용성에 관한 것입니다 ... 이러한 캐스팅을 사용하면 실행될 때 위의 스크립트에 오류가 발생합니다. 저것들. 배열 포인터 요소가 참조하는 클래스의 이름을 알아야 합니다.
그런 다음 편의가 무엇인지 파악하지 못했습니다.
MQ는 한 곳에서만 void*를 사용합니다.
typedef string (*DoubleToStringFunction)( double , void *);
Alexey Navoykov :
CObject에 모든 것이 구축되어 있기 때문입니다. 그리고 이것은 클래스에서 상속되지 않은 자체 클래스 및 인터페이스에 대해 컨테이너를 사용하는 것을 불가능하게 만듭니다. 저것들. 보편적인 솔루션이 아닙니다.
아마도 이것은 라이브러리 생성 당시 MQL에 void*가 없었기 때문일 것입니다.
불행히도 나는 사용 예를 보지 못했습니다.
컴파일러 오류입니다. 빌드 1961, 64비트.