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を適用しようとすると、pointer to this function type is not supported yetというエラーが出ます。上の手順を試してみましたが、何のために表示されているのか、コメントがないので、何も動きません。
 
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型か、どちらかです。

OK、気にしないで、著者はいつも高度に専門的な問題を持っています;)

 
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を適用しようとすると、pointer to this function type is not supported yetというエラーが出ます。上の手順を試してみましたが、何のために表示されているのか、コメントがないので、何も動きません。

ちょっと気になったのですが、どのように使う予定ですか?

 

なぜクラス全体へのポインタを保存する必要があるのか、以下はその例です。https://docs.mql4.com/ru/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"); }
}
また、ガイドで似たようなものを見たことがありますが、手が痛いし、仕事もあるので、これらのサイトはすでに閉じています。