如何在类成员中存储函数? (使用函数作为回调)

时间:2012-06-17 08:42:53

标签: c++ function-pointers

我想将一个函数存储为类成员并在类中调用它?非常像回调函数。我的班级画了一份文件,但每个文件都必须画出不同所以我想将一个函数(在类之外编写)分配给类的一个成员,然后在我想绘制文档时调用它。

此函数主要负责根据每个特定文档转换对象。

这是我的班级:

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

    void *TransFunc();
}

void Transform()
{

}

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

我知道这可能是一个简单的问题,但我无法通过Google搜索或搜索来找到答案。

3 个答案:

答案 0 :(得分: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.
}

答案 1 :(得分:2)

您需要使用 Pointer to member function

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

然后您可以将TransFuncPtr用作类型


使用您的编辑您似乎只需要指向免费功能的指针。
这是 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;
}

答案 2 :(得分:0)

C语言继承的C声明语法很棘手。

您的声明

void *TransFunc();

实际上与

相同
void* TransFunc();

声明一个返回指针的函数,而不是指向函数的指针。

要使*绑定到声明的名称而不是类型,您必须使用一组额外的括号

void (*TransFunc)();