将成员函数传递给函数指针

时间:2010-11-30 04:14:44

标签: c++

我必须将成员函数的函数指针传递给另一个类。我无法编译它,我得到“未定义的引用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
}

3 个答案:

答案 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 );
};

就样式和代码的可读性而言,这太可怕了 - 将两个类绑在一起,并且代码嗅到了嗅觉。需要查看某种适配器类或其他设计模式才能使这两个类一起工作。