在c++中,对象可以警告类它已经发生了变化吗?
can an object warn a class that it has changed in c++?
Class1可以警告Class2它已经改变,而不需要我创建一个方法来访问Class2中的Class1对象吗?基本上我想坚持使用点符号。没有setter和getter
class Class1 {
public:
void operator=(Class1 class1Obj) {
// call class1ObjWasChanged() which is in Class2 from here
}
};
class Class2 {
public:
Class1 class1Obj;
void class1ObjWasChanged() {
std::cout << "class1Obj was changed!!";
}
};
int main() {
Class2 class2Obj;
Class1 someClass1Obj;
class2Obj.class1Obj = someClass1Obj;
}
如果可能的话,上面的代码应该以某种方式调用class1ObjWasChanged()
。难道Class1不知道Class2的存在吗? 正如评论中建议的那样,您可以应用观察者模式来完成此操作。实现这一点的一个简单方法是提供一个Observer
类,该类定义一个或多个纯虚函数,这些函数将在发生更改时调用。然后,您将需要维护一个对象列表,这些对象希望收到更改通知。在你把这些放在一起之后,你可以在你的拷贝赋值操作符中添加必要的逻辑来调用所有请求更改通知的对象。
#include <vector>
#include <iostream>
#include <string>
class Observable
{
public:
// Provide class that defines the requirements of an observer class
// that is capable of receiving change notifications.
struct Observer
{
virtual ~Observer() {}
// Pure virtual function requires all derived classes to
// provide an implementation of the function.
virtual void onChanged(const Observable& object) = 0;
};
// constructor
Observable(const std::string& name) : name_(name) {}
// Let the outside world add observers that will be notified.
void addObserver(Observer* ob)
{
observers_.push_back(ob);
}
// copy assignment operator
Observable& operator=(const Observable& other)
{
name_ = other.name_;
// alert the observers that want to know about changes
for(auto it = observers_.begin(); it != observers_.end(); ++it)
{
(*it)->onChanged(*this);
}
return *this;
}
std::string name() const
{
return name_;
}
private:
std::string name_;
std::vector<Observer*> observers_;
};
class PeepingTom : public Observable::Observer
{
public:
void onChanged(const Observable& object)
{
std::cout
<< "object name was changed to '"
<< object.name()
<< "'"
<< std::endl;
}
};
int main()
{
PeepingTom observer;
Observable changable("some name");
// Add the observer
changable.addObserver(&observer);
std::cout
<< "`changable` is currently name named '"
<< changable.name()
<< "'"
<< std::endl;
// Change it
changable = Observable("new name");
}
相关文章:
- 我正在将一个 std::string 传递给一个 boost 函数,该函数对该类型进行常量引用,但该值发生了变化
- c++问题:给一个变量赋值后,另一个变量发生了变化
- libstdc++的make_shared布局在gcc 4.x和gcc 6.x之间是否发生了变化?
- 为什么我的 int 在 C++ 程序中间发生了变化?
- 共享指针和回调注册的结构.由于我之外的原因调用回调时,原始指针值发生了变化
- 这个树搜索功能让我发疯.它返回 NULL,但不知何故主函数中的值发生了变化
- 默认初始化的含义在C 11中发生了变化
- c_str()的寿命是否在g++4.8.4和g++5.3.1之间发生了变化
- C++11与C++98转换运算符的行为发生了变化
- printf中的优先级似乎发生了变化
- 更改字符集后,MFC 应用程序的视觉外观发生了变化
- 在矢量中推回后,数字发生了变化
- 为什么std::vector的构造函数接口在C++11中发生了变化
- 对象似乎正在删除自己,或者在构造函数之后内存发生了变化
- 在c++中,对象可以警告类它已经发生了变化吗?
- 为什么c++ 17中std::函数的operator()发生了变化?
- 如何在sqlite3中检查列的数量是否发生了变化
- 当我没有给变量赋新值时,为什么变量的值发生了变化?
- 为什么退出函数时节点值发生了变化
- 检测表单中任何小部件的状态是否发生了变化