1

ヘッダー ファイルで次のように宣言された関数のグループと関数ポインターがあります。

public:     // User declarations
void __fastcall TTopForm::Method1(void);
void __fastcall TTopForm::Method2(void);
void __fastcall TTopForm::Method3(void);
void __fastcall ( TTopForm::*Method )(void) ;

次に、私のプログラムでは、これを行います

Method = Method1;

これにより、「メンバー関数を呼び出すか、そのアドレスを取得する必要があります」というエラー メッセージが生成されます。もちろん、私はこれを試しますが、運はありません。

Method = &Method1;

私は何を間違っていますか?私は回路設計者であり、コードの専門家ではありません。明示的なコードを教えてください。

答えてくれてありがとう。C++ Builder を使用している可能性のある他の人のために、私が行ったことを投稿します。ヘルプ ファイルごとに typedef を使用しています。typedef で __fastcall を省略したのは、私の間違いの 1 つです。

class TTopForm : public TForm
{
 typedef void (__fastcall TTopForm::* TMethod)(void);
 ...

 public:     // User declarations
 void __fastcall TTopForm::Method1(void);
 void __fastcall TTopForm::Method2(void);
 void __fastcall TTopForm::Method3(void);
 ...

次に、私のコードで:

TMethod Method = &TTopForm::Method1;
(TopForm->*Method)();
4

4 に答える 4

2

Jesse は、C++ 標準が期待していることに従って質問に答えました。特に C++Builder__closureを使用しているため、標準の C++ メソッド ポインタよりもはるかに使いやすく、はるかに柔軟なコンパイラ拡張機能を利用できます。例えば:

class TTopForm : public TForm
{
    typedef void __fastcall (__closure *TMethod)(void);
    ...

public:     // User declarations
    void __fastcall Method1(void);
    void __fastcall Method2(void);
    void __fastcall Method3(void);
    ...
};

TMethod Method = &Method1;
Method(); // calls this->Method1()

柔軟__closureなのは、特定のクラスに限定されないことです。オブジェクト ポインタへの参照を保持するため、元のクラス タイプを知る必要はまったくありません。たとえば、次も有効です。

typedef void __fastcall (__closure *TMethod)(void);

class TTopForm : public TForm
{
public:     // User declarations
    void __fastcall Method1(void);
    ...
};

class TBottomForm : public TForm
{
public:     // User declarations
    void __fastcall Method1(void);
    ...
};

TTopForm *TopForm = ...;
TBottomForm *BottomForm = ...;
TMethod Method;

Method = &(TopForm->Method1);
Method(); // calls TopForm->Method1()

Method = &(BottomForm->Method1);
Method(); // now calls BottomForm->Method1(), using the same TMethod variable!
于 2013-09-28T06:34:00.203 に答える
-1

感じる

Method = Method1;

になるはずだった:

Method = ObjectOfClass.Method1

しかし、よくわかりません。

于 2013-09-27T13:23:13.470 に答える