修复 C++ 中的观察者设计模式
fixing Observer design pattern in c++
我正在用 C++ 实现观察者设计模式。这是一个非常简单的应用程序,观察者在其中注册并在股票价格更新时收到通知。我在编译时遇到以下错误,不幸的是无法修复它。我希望你们能提供帮助。
编译器错误:-
observer.cpp: In method `void StockGrabber::notifyAll()':
observer.cpp:54: no matching function for call to `__rb_tree_iterator<observer *
,observer *const &,observer *const *>::end ()'
observer.cpp:56: request for member `update' in `(&it)->__rb_tree_iterator<obser
ver *,observer *const &,observer *const *>::operator *<observer *, observer *con
st &, observer *const *>() const()', which is of non-aggregate type `observer *'
我的代码如下:-**
#include<iostream>
#include<map>
#include<set>
#include<string>
using namespace std;
class observer{
public:
virtual void update(string s) = 0;
virtual void remove();
};
class subject{
public:
virtual void Register(observer *o);
virtual void UnRegister(observer *o);
virtual void notifyAll();
};
class StockGrabber : public subject
{
map<string,double> mymap;
set<observer *> myset;
string getNewPrice()
{
string s="";
map<string,double>::iterator it;
for(it=mymap.begin();it!=mymap.end();++it)
{
s=s+it->first+" - "+to_string(it->second)+"n";
}
return s;
}
public:
virtual void Register(observer *o){
myset.insert(o);
}
virtual void UnRegister(observer *o){
myset.erase(o);
}
virtual void notifyAll(){
string s=getNewPrice();
set<observer *>::iterator it;
for(it=myset.begin();it!=it.end();++it)
{
(*it).update(s);
}
}
void setPrice(string stock,double price)
{
mymap[stock]=price;
}
};
class stockObserver : public observer
{
subject *stockGrabber;
public:
stockObserver(subject *sobj)
{
stockGrabber=sobj;
sobj->Register(this);
}
void remove()
{
stockGrabber->UnRegister(this);
}
virtual void update(string s){
cout<<"New Updaten";
cout<<s;
}
};
void main()
{
StockGrabber *stockgrabber=new StockGrabber();
stockObserver *ob1 = new stockObserver(stockgrabber);
stockgrabber->setPrice("google",21.43);
stockgrabber->setPrice("apple",21.43);
}
-
end()
应该在第 54 行的容器上调用,而不是迭代器 -
myset
是一个set<observer *>
,所以在取消引用迭代器后,你会得到一个observer*
,在第 56 行
试试这个:
virtual void notifyAll(){
string s=getNewPrice();
set<observer *>::iterator it;
for(it=myset.begin();it!=myset.end();++it)
//^^^^^ HERE
{
(*it)->update(s); // AND HERE
}
}
此外,您可能希望将观察者签名更改为:
class observer {
public:
virtual void update(const string& s) = 0;
virtual void remove();
};
并相应地更新其余部分。
相关文章:
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 在C++中创建观察器设计模式的好方法
- 反射 + 函数指针与观察者模式
- 观察者模式不起作用
- 观察者模式:为什么主题应该是抽象的?
- 使用 RxCpp 构建观察者/可观察模式
- C 设计:多个TCP客户端,Boost ASIO和观察者
- 观察者模式专业化
- 如何在不必绑定到特定类的情况下实现观察者模式
- C++,函数指针与观察者模式
- C++11观察者模式(信号、插槽、事件、更改广播器/侦听器,或任何您想称之为的东西)
- 修复 C++ 中的观察者设计模式
- 实施观察者模式C
- C++自己的观察者模式
- 不同可观察量的观察者模式
- 通过Boost信号的观察者模式2
- 具有类型信息的观察者模式(C++)
- 代码设计:观察者模式
- 观察者模式和继承:未调用正确的函数
- 观察者设计模式接口契约设计问题