4

这是我的代码的一部分:

在啊:

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

4 回答 4

9

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

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

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); 

在线演示

于 2012-04-19T15:25:53.440 回答
3

要存储指向类函数的指针,您需要一些特殊的东西,即指向成员的指针。在这里你可以找到一个很好的解释

简而言之,成员函数不能存储在普通函数指针中,因为它需要将 this 指针传递给当前类。静态成员函数像普通函数一样工作,因为它不需要 this 指针。

于 2012-04-19T15:24:06.897 回答
1

一旦您了解了其中一些库,也许您可​​以更好地重新构建您正在尝试做的任何事情:

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

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

其中任何一个都将提供传递函数以供以后调用的能力。

于 2012-04-19T16:01:23.453 回答
-2

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

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

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

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

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

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

于 2012-04-19T15:42:50.697 回答