我有以下问题:
class A
{
public:
A()
{}
int foo(int a)
{
return a;
}
};
class B
{
private:
int (A::*pFoo)(int);
public:
B(int (A::*_pFoo)(int))
{
this->pFoo = _pFoo;
}
int cFoo(int i)
{
this->pFoo(i); //this causes a problem the compiler says it's not a pointer
}
};
A a;
B b(&A::foo);
我已经尝试过了
int (*pFoo)(int)
而不是
int (A::*pFoo)(int)
但是构造函数存在问题
当我使用B b(&a.foo)
时出现编译错误,说我必须使用B b(&A::foo)
答案 0 :(得分:1)
您尝试为A:foo
类型的对象调用B
,但指向A
成员函数的指针需要A
的实例。
您可以重新设计A
的代码,而不是在B
内保存另一个指针或对B
的引用,而不是更通用:
#include <functional>
struct A
{
int foo(int a)
{
return a;
}
};
class B
{
private:
std::function<int(int)> pfoo;
public:
B(std::function<int(int)> foofunc)
: pfoo(foofunc) { }
int cFoo(int i)
{
return pfoo(i);
}
};
现在B
可以使用一个int
参数返回int
的任何函数指针,并且只需将A::foo
的函数指针绑定到A
的实例}:
A my_a;
B my_b(std::bind(&A::foo, my_a, std::placeholders::_1));
my_b.cFoo(2); // works
答案 1 :(得分:0)
你错过了B的构造函数中的右括号:
B(int (A::*_pFoo)(int))
通过成员函数指针调用的正确语法是:
(this->*pFoo)(i);
答案 2 :(得分:0)
在进入指针之前,你有很多语法错误。
工作示例: http://coliru.stacked-crooked.com/a/1f8fb012496548e0
1)你错过了c.tor上的括号
B(int (A::*_pFoo)(int))
2)你的课程结束不好,他们在结束时需要;
:
class A{};
3)你没有任何主力。
4)你激活pFoo错误。想一想。如果pFoo
是指向A
成员函数的指针,你真的可以从B
指针激活吗?因为这是this
指向B
类的内容。你需要用A
指针激活pFoo。
A* a = nullptr;
return (a->*pFoo)(i);