如何在类中获取方法的地址?

时间:2012-04-19 15:20:25

标签: c++

以下是我的代码的一部分:

在a.h中:

class classA
{
public:
void (*function_a)(void);
classA();
void function_a();
};

在a.cpp中:

void classA::classA()
{
  (*function_a)() = function_a;
}

void classA::function_a()
{
  return;
}

我想得到function_a的地址并将其保存到void(* function_a)(void)中,但是我得到了编译错误“表达式不可分配”。我该怎么做才能解决这个问题?

4 个答案:

答案 0 :(得分:8)

首先,为不同的事物选择不同的名称。

其次,非静态成员函数指针应声明为:

void (classA::*memfun)(void); //note the syntax

那么作业应该是:

memfun = &classA::function_a; //note &, and note the syntax on both sides.

你将其称为:

classA instance;
(instance.*memfun)();

这就是你在C ++ 03中所做的。

但是,在C ++ 11中,您也可以使用std::function。这是你如何做到的:

std::function<void(classA*)> memfun(&classA::function_a);

你将其称为:

classA instance;
memfun(&instance); 

Online demo

答案 1 :(得分:3)

要存储指向类函数的指针,您需要一些特殊的东西,一个指向成员的指针。 Here you can find a good explanation

简而言之,成员函数不能存储在普通函数指针中,因为它需要将this指针传递给当前类。静态成员函数的作用类似于普通函数,因为它不需要这个指针。

答案 2 :(得分:1)

一旦你了解了其中的一些库,也许你可以更好地重新构建你想要做的事情:

1)如果你使用c ++ 11,你可以使用std::function

2)否则,如果您遇到旧编译器,则可以使用boost::function

任何这些都将提供传递函数以便以后调用的能力。

答案 3 :(得分:-1)

Nawaz已经解释了如何正确地做到这一点。与指向全局函数的指针相比,对类成员函数的指针有很多限制。唯一的例外是静态成员函数,它们几乎与全局函数相同,只不过它们是类名空间的成员。

函数指针的C ++替代函数是函数对象。这些类有一个或几个operator()的重载:

class MyFunction
{
public:
    <return-type> operator() (... parameters ...);
};

然后您可以执行以下操作:

MyFunction fnct;
fnct(... args ...);

即,您可以像使用函数一样使用类实例。