让我们说,我有两个班级
class A
{
public:
void foo( /* ............. */ );
};
class B
{
public:
void bar();
};
我想知道,如果甚至可以向foo
方法传递bar
方法的指针,请将其存储在A
中并稍后从bar
运行A
{1}}。我应该说,A
不知道,bar
是哪个班级的成员!
如果你向我展示语法或某些链接而不是那个复杂的主题描述,我会非常感激。
描述
我正在为C ++设计observer
模式。我想为B
的某些事件订阅A
。例如此代码应位于B
// pseudo code
A* observable = new A();
observable->addEventListener ( 'eventTitle' , functionName );
eventTitle
发生时A
调用functionName
的{{1}}
答案 0 :(得分:2)
除非bar
被声明为static
的{{1}}成员,否则无效。您应该考虑到需要B
的实例才能调用任何非静态方法。
(查看C++ FAQ chapter on pointer-to-member-functions以获得更深入的解释。)
UPDATE :如果你想实现一个观察者模式,你可以声明一个接口(纯抽象类),比如B
,Observer
知道并使用指针 - to-member-functions,用于将事件映射到相应的A
方法。
示例:
Observer
答案 1 :(得分:2)
A
如何在不知道任何内容的情况下使用B
的成员函数?要调用它,您需要一个对象,该对象必须是B
(或子类型),因此A
必须具备此知识。
如果你使bar()
成为一个静态函数,你可以使用常规函数指针(void (*)()
)或std::function<void ()>
(boost::function
用于较旧的C ++) - 我强烈要求推荐后者。
答案 2 :(得分:2)
有几种方法可以调用指向成员函数的指针,隐藏它的原点:
使用std :: function和std :: bind:
class B {
double Sqrt(int what) { return std::sqrt((double)what); }
};
// in A:
std::tr1::function<double (int)> fn;
fn = std::tr1::bind(&B::Sqrt, &operations, std::tr1::placeholders::_1);
fn(3.1415);
使用一个仿函数,它将指向成员函数的指针和要调用它的对象包装起来。 (但这有点复杂,原则上只是std :: function的子集。)
答案 3 :(得分:1)
使用类似:
class A
{
public:
void foo( /* ............. */ );
void SetObs(CObs *pObs)
{
m_pObs = pObs;
}
private:
CObs *m_pObs;
};
class B : public class CObs
{
public:
virtual void bar();
};
class CObs
{
public:
virtual void bar() = 0;
};
每当你需要bar()函数时,调用m_pObs-&gt; bar()。还从CObs派生所有类似B的类并覆盖函数bar()。