2

関数をクラスメンバーとして保存し、クラス内で呼び出したいですか?コールバック関数によく似ています。私のクラスはドキュメントを描画しますが、すべてのドキュメントは異なる方法で描画する必要があります。そのため、クラスのメンバーの1つに関数(クラスの外部で記述されたもの)を割り当て、ドキュメントを描画するときにそれを呼び出します。

この関数は主に、特定の各ドキュメントに従ってオブジェクトを変換する役割を果たします。

これが私のクラスです:

class CDocument
{
public:
    CDocument();
    ~CDocument();

    void *TransFunc();
}

void Transform()
{

}

int main()
    CDocument* Doc = new CDocument();
    Doc->TransFunc = Transform();
}

これはおそらく単純な質問だと思いますが、グーグルで検索したり、SOを検索したりしても答えが見つかりませんでした。

4

3 に答える 3

4

これはあなたが望むかもしれないものだと思います。ご不明な点がございましたら、お気軽にお問い合わせください。

class CDocument
{
public:
    CDocument():myTransFunc(NULL){}
    ~CDocument();

    typedef void (*TransFunc)();  // Defines a function pointer type pointing to a void function which doesn't take any parameter.

    TransFunc myTransFunc;  //  Actually defines a member variable of this type.

    void drawSomething()
    {
         if(myTransFunc)
            (*myTransFunc)();   // Uses the member variable to call a supplied function.
    }
};

void Transform()
{

}

int main()
{
    CDocument* Doc = new CDocument();
    Doc->myTransFunc = Transform;  // Assigns the member function pointer to an actual function.
}
于 2012-06-17T09:02:49.800 に答える
3

You need to use a Pointer to member function.

typedef void (CDocument::*TransFuncPtr)();

And then you can use TransFuncPtr as an type.


With your edit It seems like you just need a Pointer to a Free function.
Here is a small working sample.

#include<iostream>
#include<string>

typedef void (*TransFuncPtr)();

class Myclass
{
     public:
     TransFuncPtr m_funcPtr;
};

void doSomething(){std::cout<<"Callback Called";}

int main()
{
    Myclass obj;
    obj.m_funcPtr = &doSomething;
    obj.m_funcPtr();
    return 0;
}
于 2012-06-17T08:44:36.127 に答える
0

C ++に継承されたC宣言構文には、注意が必要です。

あなたの宣言

void *TransFunc();

実際にはと同じです

void* TransFunc();

これは、関数へのポインターではなく、ポインターを返す関数を宣言します。

タイプではなく宣言された名前に*バインドするには、追加の括弧のセットを使用する必要があります

void (*TransFunc)();
于 2012-06-17T09:30:34.337 に答える