【问题标题】:Function pointer of a non-static member function of a class类的非静态成员函数的函数指针
【发布时间】:2012-12-28 05:31:12
【问题描述】:

我想在类中定义一个成员函数并使用它的指针。我知道我可以使用静态成员函数,但问题是我只能访问类的静态成员。除了静态成员函数还有其他方法可以获取函数指针吗?


更具体地说:我正在使用一个库,它获取一个函数指针作为其输入。我想编写一个成员函数并将其函数指针分配给该外部库。我应该创建一个类的对象还是使用这个指针来做到这一点?

【问题讨论】:

  • 提示:您必须需要一个 object 才能访问非静态成员。
  • 网上有很多教程:Dherehere有一些例子。
  • Yes.

标签: c++ static function-pointers functor member-function-pointers


【解决方案1】:

可以获取方法的指针,但必须用对象调用

typedef void (T::*MethodPtr) ();
MethodPtr method = &T::MethodA;
T *obj = new T();
obj->*method();

如果您需要非对象指针并且想要使用对象,那么您必须将对象的实例存储在某处,但您只能使用一个对象(单例)。

class T {
  static T *instance;
public:
  T::T() {
    instance = this;
  }
  static void func() {
    instance->doStuff();
  }
  void doStuff() {}
};

如果库支持函数指针的用户数据,那么您可能有多个实例

class T {
public:
  static void func(void *instance) {
    ((T*)instance)->doStuff();
  }
  void doStuff() {}
};

【讨论】:

【解决方案2】:
  • 如果:
  • 您想从类中获取非静态成员的函数指针
  • 并在课堂上使用它:
  • 然后: 它可以工作,因为当你获取成员函数地址时,有一个“this”指针。语法对我来说并不明显,它可能看起来有些难看,但还不错。 对于真正的专家来说,这可能并不新鲜,但我早就想把它放在我的技巧包里了。

这是一个完整的示例程序:

#include <iostream>
class CTestFncPtr
{
public:
    CTestFncPtr(int data) : mData(data)
    {
//      Switch = &CTestFncPtr::SwitchC; // Won't compile - wrong function prototype - this is type safe
        if (data == 1)
            Switch = &CTestFncPtr::SwitchA;
        else
            Switch = &CTestFncPtr::SwitchB;
    }
    void CallSwitch(char *charData)
    {
        (this->*Switch)(charData);
    }

private:
    void SwitchA(char * charData)
    {
        std::cout << "Called Switch A " << "Class Data is " << mData<<" Parameter is " << charData<< "\n";
        Switch = &CTestFncPtr::SwitchB;
    }
    void SwitchB(char * charData)
    {
        std::cout << "Called Switch B " << "Class Data is " << mData<<" Parameter is " << charData<< "\n";
        Switch = &CTestFncPtr::SwitchA;
    }
    void SwitchC()
    {
    }
    void(CTestFncPtr::*Switch)(char * charData);
    int mData;
};

int main(int argc, char * argv[])
{
    CTestFncPtr item1(1);
    item1.CallSwitch("Item1");
    item1.CallSwitch("Switched call Item 1");
    CTestFncPtr item2(0);
    item2.CallSwitch("Item2");
    item2.CallSwitch("Switched call Item 2");

    return 0;
}

【讨论】:

    猜你喜欢
    • 2010-11-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多