我必须将成员函数的函数指针传递给另一个类。我无法编译它,我得到“未定义的引用classB :: classB(classA :: *)(std :: shared_ptr)”错误。有人可以帮我这个吗?
感谢。
classA{
string functionA(share_ptr<int>);
void functionB(){
classB* ptr = new classB(&classA::functionA);
}
}
//in other .h file
classA; //forward declaration
classB{
classB(string (classA::*funcPtr)(shared_ptr<int>); //constructor
}
答案 0 :(得分:2)
我的代码正如我写的那样:
classA{
string functionA(share_ptr<int>);
void functionB(){
classB* ptr = new classB(&classA::functionA);
}
}
下面:
share_ptr
应为shared_ptr
。
类定义结尾处缺少分号。
然后,
//in other .h file
classA; //forward declaration
classB{
classB(string (classA::*funcPtr)(shared_ptr<int>); //constructor
}
下面:
左括号(
只有三个,但只有两个右括号)
。
在类定义的末尾缺少分号。
您询问链接错误,但您的代码甚至不应该编译。
当你说“我无法编译”时,似乎是正确的。
然后当你说“我得到[未定义引用...]”时,这很神秘:使用你明显使用的工具链,编译失败时不应该调用链接器。
总之,这个问题包含一些不正确的信息和任何答案(例如你没有定义函数的假设,或者你在某处定义它但忘记链接的假设,或假设你'重新报告构建除代码之外的其他内容的错误,等等)将是纯粹的猜测。
请发布一个完整的小程序,编译并说明链接错误。
干杯&amp;第h。,
答案 1 :(得分:0)
从表面上看,这看起来像是一个前向声明问题。尝试声明classA::functionB
,然后在定义classA::functionB
之后定义classB
。
答案 2 :(得分:0)
只是为了咯咯笑,即使你说它为你编译,也要回答这个......
// In a.hpp
#include "b.hpp" // you need to include this because you will not
// be able to call B's constructor in your functionB() method
class A
{
public:
string functionA ( shared_ptr<int> ); // IIRC, needs to be public to call it
// from B's constructor.
// can be public/protected/private depending on where it's called ...
void functionB () {
B * ptrB = new B ( &A::functionA );
}
};
和
// In b.hpp
// Forward declare class A
class A;
// To make the constructor of B cleaner, use a typedef.
typedef string (A::*IntPtrToStrFn) ( shared_ptr<int> );
class B
{
public:
B ( IntPtrToStrFn fnptr );
};
就样式和代码的可读性而言,这太可怕了 - 将两个类绑在一起,并且代码嗅到了嗅觉。需要查看某种适配器类或其他设计模式才能使这两个类一起工作。