MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1096

 

클래스 메서드 에 대한 포인터를 만드는 방법은 무엇입니까?

 class qer{
public :
int _int( int q){...}
int int_( int q){...}
};qer *_qer

함수 포인터 _int 및 int_를 만들어야 합니다.

mql4에서는 포인터와 클래스에 대해 설명합니다( https://docs.mql4.com/ru/basis/types/this , https://docs.mql4.com/ru/basis/types/object_pointers , https: //docs.mql4.com/ru/common/getpointer ) 그러나 주석이 없고 그것이 무엇을 위한 것이며 무엇을 하는지 명확하지 않습니다. 클래스가 없으면 typedef를 사용하여 포인터를 선언하는 것은 어렵지 않지만 클래스에서 어떻게 작동하는지 알고 싶습니다.

클래스 함수에 대해 typedef를 적용하려고 하면 이 함수 유형에 대한 오류 포인터가 아직 지원되지 않습니다. 위의 지침을 시도했지만 무엇에 대해 표시되지 않고 코멘트가 없으며 나에게 아무 일도 일어나지 않았습니다.
 
Seric29 :

클래스 메서드 에 대한 포인터를 만드는 방법은 무엇입니까?

함수 포인터 _int 및 int_를 만들어야 합니다.

mql4에서는 포인터와 클래스에 대해 설명합니다( https://docs.mql4.com/ru/basis/types/this , https://docs.mql4.com/ru/basis/types/object_pointers , https: //docs.mql4.com/ru/common/getpointer ) 그러나 주석이 없고 그것이 무엇을 위한 것이며 무엇을 하는지 명확하지 않습니다. 클래스가 없으면 typedef를 사용하여 포인터를 선언하는 것은 어렵지 않지만 클래스에서 어떻게 작동하는지 알고 싶습니다.

클래스 함수에 대해 typedef를 적용하려고 하면 이 함수 유형에 대한 오류 포인터가 아직 지원되지 않습니다. 위의 지침을 시도했지만 무엇에 대해 표시되지 않고 코멘트가 없으며 나에게 아무 일도 일어나지 않았습니다.
금지된다
 
 
하지 그. 사람은 상속자에 대한 캐스트가 아니라 클래스 메서드에 대한 포인터가 필요합니다.
 
Vladimir Simakov :
하지 그. 사람은 상속자에 대한 캐스트가 아니라 클래스 메서드에 대한 포인터가 필요합니다.

다른 선택 없음 - 액세스 제어가 없는 절차적 스타일 또는 액세스 제어 및 유형이 있는 OOP

좋아요, 작성자가 항상 고도로 전문화된 문제를 가지고 있다는 것은 중요하지 않습니다.)

[삭제]  
Seric29 :

클래스 메서드 에 대한 포인터를 만드는 방법은 무엇입니까?

함수 포인터 _int 및 int_를 만들어야 합니다.

mql4에서는 포인터와 클래스에 대해 설명합니다( https://docs.mql4.com/ru/basis/types/this , https://docs.mql4.com/ru/basis/types/object_pointers , https: //docs.mql4.com/ru/common/getpointer ) 그러나 주석이 없고 그것이 무엇을 위한 것이며 무엇을 하는지 명확하지 않습니다. 클래스가 없으면 typedef를 사용하여 포인터를 선언하는 것은 어렵지 않지만 클래스에서 어떻게 작동하는지 알고 싶습니다.

클래스 함수에 대해 typedef를 적용하려고 하면 이 함수 유형에 대한 오류 포인터가 아직 지원되지 않습니다. 위의 지침을 시도했지만 무엇에 대해 표시되지 않고 코멘트가 없으며 나에게 아무 일도 일어나지 않았습니다.

그냥 궁금합니다. 어떻게 사용할 계획인가요?

 

전체 클래스에 대한 포인터를 여기에 저장해야 하는 이유는 https://docs.mql4.com/en/basis/types/this 의 예입니다.

 //+------------------------------------------------------------------+
//| возвращает собственный указатель                                 |
//+------------------------------------------------------------------+
CDemoClass *CDemoClass::getDemoClass( void )
  {
   return ( GetPointer ( this ));
  }

그럼 어떻게 할까요?

 
Vladimir Simakov :
금지된다

이것이 수행될 수 없는 경우 질문이 발생합니다. 그러면 함수를 허용하는 클래스에 함수가 작성되는 이유는 무엇입니까? 게다가 때로는 인터페이스를 구현해야 하고 어떤 함수를 호출해야 할지 모를 때도 있습니다.

 
Seric29 :

이 작업을 수행할 수 없는 경우 문제가 발생합니다. 그러면 함수를 허용하는 클래스에 함수가 작성되는 이유는 무엇입니까? 게다가 때로는 인터페이스를 구현해야 하고 어떤 함수를 호출해야 할지 모를 때도 있습니다.

어떤가요?

 
Vladimir Simakov :

어떤가요?

함수 포인터는 매개변수로 전달됩니다. 나는 수업에서 아무도 그것을 하는 방법을 알아내지 못했다는 것을 안다. 나는 또한 그것이 제공하는 클래스에 대한 포인터를 반환해야 하는 이유를 여전히 이해하지 못합니다.

여기에 흥미로운 예가 있지만 이것은 내 질문이 아닙니다.

 #property strict

class CStrategy;
typedef bool (*SignalFn)(CStrategy*);

// Global function definitions
bool IsBuySignal(CStrategy*ptr) { return ptr.IsBuySignal(); }
bool IsSellSignal(CStrategy*ptr) { return ptr.IsSellSignal(); }

// Create an abstract base class
class CStrategy
{
public :
         virtual bool IsBuySignal( void )= 0 ;
         virtual bool IsSellSignal( void )= 0 ;
};

// Derived class
class Strat1 : public CStrategy
{
public :
         // Implement the required functions
         bool IsBuySignal( void ) { return true ;}
         bool IsSellSignal( void ) { return true ;}
};

void OnStart ()
{
         // instantiate a class
        Strat1 strat1;

         // Global functions work as expected
        SignalFn ptrSignalFn;                           // pointer to a signal function
        ptrSignalFn = IsBuySignal;
         if ( ptrSignalFn(&strat1) ) { Print ( "Is Buy" ); }
}
디렉토리에서도 비슷한 것을 보았지만 이미 이 사이트를 닫았습니다. 손이 아프고 일을 해야 합니다.