C++ C++;:如果某个类的成员对象的变量发生变化(回调似乎不起作用),该类的成员对象如何告知该类

C++ C++;:如果某个类的成员对象的变量发生变化(回调似乎不起作用),该类的成员对象如何告知该类,c++,class,callback,C++,Class,Callback,我的问题是: 我有一个a类,其中有一个b类的私人成员b,如: class A { public: A(); ~A(); private: B b; }; class B { public: B(); ~B(); int getMemberOfB() {return m_memberOfB;} private: int m_memberOfB; }; 如果m_memberOfB发生变化,是否有任何方法可以观

我的问题是:

我有一个a类,其中有一个b类的私人成员b,如:

class A 
{ 
public:
      A();
      ~A();
private:
      B b;
};

class B
{
public:
      B();
      ~B();
      int getMemberOfB() {return m_memberOfB;}
private:
      int m_memberOfB;
};
如果
m_memberOfB
发生变化,是否有任何方法可以观察A对象中的
m_memberOfB
?(就像qt中的signal&slot机制)因为b是类a的成员,所以回调可能也不工作,是吗?实际上,如果A的对象中的
m\u memberOfB
发生了更改,我希望获得
m\u memberOfB
的当前值。有什么想法吗?非常感谢


编辑:我是新手。如果回调可以工作,我想将类a的成员函数设置为回调,B可以调用它。但是为了调用回调函数,应该有一个a的对象,它可以调用回调。如何在b中获得A的实例?或者将回调设置为全局函数?谁能给我举个小例子吗?非常感谢

首先,您可能希望将
B::m_memberOfB
设置为静态;否则,对于B类的每个实例,您都会有一个不同的实例,这意味着您将知道它何时更改,因为您将从a对象更改它

在那之后,你需要把问题放到上下文中去。C/C++中有大量的信令机制,这完全取决于您所处理的内容。 例如,在处理线程时,可以使用互斥体和/或信号量,对于进程间信令,可以使用管道或信号。 您甚至可以使用消息队列


假设您只有一个线程(main),并且希望实现刚才所说的功能—您必须使用轮询,无论是手动检查值以查看其是否更改,还是使用仅在值更改由您决定时才释放的互斥锁,但您仍然在轮询

为什么回调不能工作?B有一个指向函数(等)的指针,如果不为null,则每次调用setB时都调用它。在A的构造函数中,将一些函数设置为B对象的回调。信号和插槽的存在是有原因的。您必须提供一个带有重载运算符的模板,以同时获取功能和观察者通知,并注册对此模板实例的回调。