以下是我的代码的一部分:
在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)中,但是我得到了编译错误“表达式不可分配”。我该怎么做才能解决这个问题?
答案 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);
答案 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 ...);
即,您可以像使用函数一样使用类实例。