将成员函数指针传递给c++中的成员对象
我在 C++ 中使用函数指针时遇到问题。这是我的示例:
#include <iostream>
using namespace std;
class bar
{
public:
void (*funcP)();
};
class foo
{
public:
bar myBar;
void hello(){cout << "hello" << endl;};
};
void byebye()
{
cout << "bye" << endl;
}
int main()
{
foo testFoo;
testFoo.myBar.funcP = &byebye; //OK
testFoo.myBar.funcP = &testFoo.hello; //ERROR
return 0;
}
编译器在 testFoo.myBar.funcP = &testFoo.hello;
处返回错误:
ISO C++ 禁止使用绑定成员函数的地址来形成 指向成员函数的指针。说 '&foo::hello'
无法在赋值中将“void (foo::)()”转换为“void ()()”
所以我像这样尝试过:
class bar
{
public:
void (*foo::funcP)();
};
但现在编译器又添加了一个:
“foo”尚未声明
有办法让它工作吗?
预先感谢您的建议
I have a problem with using a pointer to function in C++. Here is my example:
#include <iostream>
using namespace std;
class bar
{
public:
void (*funcP)();
};
class foo
{
public:
bar myBar;
void hello(){cout << "hello" << endl;};
};
void byebye()
{
cout << "bye" << endl;
}
int main()
{
foo testFoo;
testFoo.myBar.funcP = &byebye; //OK
testFoo.myBar.funcP = &testFoo.hello; //ERROR
return 0;
}
Compilator returns an error at testFoo.myBar.funcP = &testFoo.hello;
:
ISO C++ forbids taking the address of a bound member function to form a
pointer to member function. Say
'&foo::hello'cannot convert 'void (foo::)()' to 'void ()()' in assignment
So i tried it like this:
class bar
{
public:
void (*foo::funcP)();
};
But now the compilator adds one more:
'foo' has not been declared
Is there a way make it work?
Thanks in advance for suggestions
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
正如错误所述,方法属于类,而不属于单个实例。因此,指向自由函数的指针和指向非静态方法的指针是完全不同的东西。您还需要一个实例来调用该方法。
您可以使用 Boost.Bind 和 Boost.Function (我认为也在 std::tr1 中)抽象出差异并将实例绑定到方法:
As the error says, methods belong to the class, not to individual instances. For this reason pointers to free functions and pointers to non-static methods are completely different things. You'll also need an instance to call the method on.
You can use libraries like Boost.Bind and Boost.Function (also in std::tr1 I think) to abstract away the difference and also bind an instance to the method:
要使第二个选项起作用,请声明 foo 以便编译器知道它是一个类。
另请注意,您的函数指针语法不正确。
*
位于变量名称之前:To make your second option work, declare foo so the compiler knows that it is a class.
Also note that your function pointer syntax is incorrect. The
*
comes just before the name of the variable:将 foo 的声明转发到 bar 前面:
forward foo's declaration in front of bar:
综合大家的建议,您的最终解决方案将如下所示:
C++ FAQ Lite 有一些关于如何简化语法的指导。
采纳克里斯的想法并付诸实践,你可以得到这样的结果:
Taking everyone's suggestions together, your final solution will look like:
The C++ FAQ Lite has some guidance on how to simplify the syntax.
Taking Chris' idea and running with it, you could get yourself something like this: