gpt4 book ai didi

c++ - 在 C++ 中修复观察者设计模式

转载 作者:行者123 更新时间:2023-11-28 02:56:40 25 4
gpt4 key购买 nike


我正在用 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 Update\n";
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 行
  • mysetset<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++ - 在 C++ 中修复观察者设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21809093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com