Visiblement c'est ce qui est fait dans l'UML第56页 公众: 虚拟无效注册表观察者(观察者*o)=0; 虚拟空洞移除观察者(观察者*o)=0; 虚拟观察者()=0; }; 类显示元素 { 公众: 虚空显示()常量=0; }; /************************************************** *************实现*************** ***************************************************/ 班级天气数据:公共科目 { 私人: 浮子温度; 浮子湿度; 浮子压力; 公众: 虚拟无效注册表观察者(观察者*o){ 观察家们。推回(o);//你们是不是有问题? } 虚拟无效移除观察者(观察者*o){ std::vector::iterator position=std::find(observer.begin(),observer.end(),o); if(position!=observators.end()) 删除(位置); } 虚拟观察者() { for(vector::iterator it=observators.begin();it!=observators.end();it++) { (*it)->更新(温度、湿度、压力); } } 无效度量值已更改(){ notifyObserver(); } 无效设置新测量值(浮动温度、浮动嗡嗡声、浮动压力) { 这个->温度=温度; 这->湿度=嗡嗡声; 这个->压力=压力; 测量改变(); } }; 类CurrentConditionsDisplay:公共观察者,公共显示元素 { 私人: 浮子温度; 浮子湿度; 浮子压力; 主题*天气数据; //这句话的意思是:“破坏者”的意思是“施法者”。(包装物的主要利用者) 公众: 当前条件显示(主题*w){ 天气数据=w; weatherData->registerObserver(此); } 无效更新(浮动温度、浮动嗡嗡声、浮动压力){ 温度=温度; 湿度=嗡嗡声; 压力=压力; 显示(); } void display()常量{ cout,c++,design-patterns,C++,Design Patterns" /> Visiblement c'est ce qui est fait dans l'UML第56页 公众: 虚拟无效注册表观察者(观察者*o)=0; 虚拟空洞移除观察者(观察者*o)=0; 虚拟观察者()=0; }; 类显示元素 { 公众: 虚空显示()常量=0; }; /************************************************** *************实现*************** ***************************************************/ 班级天气数据:公共科目 { 私人: 浮子温度; 浮子湿度; 浮子压力; 公众: 虚拟无效注册表观察者(观察者*o){ 观察家们。推回(o);//你们是不是有问题? } 虚拟无效移除观察者(观察者*o){ std::vector::iterator position=std::find(observer.begin(),observer.end(),o); if(position!=observators.end()) 删除(位置); } 虚拟观察者() { for(vector::iterator it=observators.begin();it!=observators.end();it++) { (*it)->更新(温度、湿度、压力); } } 无效度量值已更改(){ notifyObserver(); } 无效设置新测量值(浮动温度、浮动嗡嗡声、浮动压力) { 这个->温度=温度; 这->湿度=嗡嗡声; 这个->压力=压力; 测量改变(); } }; 类CurrentConditionsDisplay:公共观察者,公共显示元素 { 私人: 浮子温度; 浮子湿度; 浮子压力; 主题*天气数据; //这句话的意思是:“破坏者”的意思是“施法者”。(包装物的主要利用者) 公众: 当前条件显示(主题*w){ 天气数据=w; weatherData->registerObserver(此); } 无效更新(浮动温度、浮动嗡嗡声、浮动压力){ 温度=温度; 湿度=嗡嗡声; 压力=压力; 显示(); } void display()常量{ cout,c++,design-patterns,C++,Design Patterns" />

C++;观察者模式-坚持“观察者模式”;“程序到接口”;主要的 我从C++中的头设计模式实现了观察者模式,我面临一个小问题。 我在station->setnewmeasurements(0.5,10.0,7.5)行上得到错误:“类主题没有名为setnewmeasurements的成员” 如果我想使用多态性,那么应该在接口(“Subject”)中定义方法“setnewmeasurements”。但是这违反了“编程到接口”的原则,我真的需要多态性来让观察者模式在这里工作。有什么意见吗?谢谢你 #include <iostream> #include <string> #include <vector> #include <algorithm> #include <iterator> using namespace std; /************************************************** *************** Interfaces ****************** ***************************************************/ class Observer { public: virtual void update(float temp, float humidity, float pressure) = 0 ; }; class Subject { protected: vector<Observer*> observers; //est-ce une bonne idée ici? c'est contraire au pattern strategy (separate changing elements from constant ones) -> Visiblement c'est ce qui est fait dans l'UML page 56 public: virtual void registerObserver(Observer* o) = 0; virtual void removeObserver(Observer* o) = 0; virtual void notifyObserver() = 0; }; class DisplayElement { public: virtual void display() const = 0 ; }; /************************************************** ************* Implementations *************** ***************************************************/ class WeatherData : public Subject { private: float temperature; float humidity; float pressure; public: virtual void registerObserver(Observer* o){ observers.push_back(o); //y'a as un probleme la? } virtual void removeObserver(Observer* o){ std::vector<Observer*>::iterator position=std::find(observers.begin(), observers.end(), o); if (position != observers.end()) observers.erase(position); } virtual void notifyObserver() { for (vector<Observer*>::iterator it=observers.begin() ; it!=observers.end() ; it++) { (*it)->update(temperature, humidity, pressure); } } void measurmentChanged() { notifyObserver(); } void setNewMeasurments(float temp, float hum, float press) { this->temperature=temp; this->humidity=hum; this->pressure=press; measurmentChanged(); } }; class CurrentConditionsDisplay : public Observer, public DisplayElement { private: float temperature; float humidity; float pressure; Subject* weatherData; // Faut penser à désallouer cette mémoire dans le destructeur --> exercice!! (le faire à la main puis utiliser le Wrapper) public: CurrentConditionsDisplay(Subject* w){ weatherData=w; weatherData->registerObserver(this); } void update(float temp, float hum, float press){ temperature=temp; humidity=hum; pressure=press; display(); } void display() const { cout << "Current Conditions Displayers " << endl << endl; cout << "Temperature : " << temperature << endl; cout << "Humidity : " << temperature << endl; cout << "Pressure : " << temperature << endl; }; }; int main() { Subject* station=new WeatherData; CurrentConditionsDisplay mDisp(station); station->setNewMeasurments(0.5,10.0, 7.5); delete station; system("PAUSE"); return 0; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; /************************************************** ***************接口****************** ***************************************************/ 类观察员 { 公众: 虚拟空隙更新(浮子温度、浮子湿度、浮子压力)=0; }; 班级科目 { 受保护的: 向量观察家;//est ce une bonne idée ici?c'est contraire au模式策略(将不断变化的元素与不变的元素分开)->Visiblement c'est ce qui est fait dans l'UML第56页 公众: 虚拟无效注册表观察者(观察者*o)=0; 虚拟空洞移除观察者(观察者*o)=0; 虚拟观察者()=0; }; 类显示元素 { 公众: 虚空显示()常量=0; }; /************************************************** *************实现*************** ***************************************************/ 班级天气数据:公共科目 { 私人: 浮子温度; 浮子湿度; 浮子压力; 公众: 虚拟无效注册表观察者(观察者*o){ 观察家们。推回(o);//你们是不是有问题? } 虚拟无效移除观察者(观察者*o){ std::vector::iterator position=std::find(observer.begin(),observer.end(),o); if(position!=observators.end()) 删除(位置); } 虚拟观察者() { for(vector::iterator it=observators.begin();it!=observators.end();it++) { (*it)->更新(温度、湿度、压力); } } 无效度量值已更改(){ notifyObserver(); } 无效设置新测量值(浮动温度、浮动嗡嗡声、浮动压力) { 这个->温度=温度; 这->湿度=嗡嗡声; 这个->压力=压力; 测量改变(); } }; 类CurrentConditionsDisplay:公共观察者,公共显示元素 { 私人: 浮子温度; 浮子湿度; 浮子压力; 主题*天气数据; //这句话的意思是:“破坏者”的意思是“施法者”。(包装物的主要利用者) 公众: 当前条件显示(主题*w){ 天气数据=w; weatherData->registerObserver(此); } 无效更新(浮动温度、浮动嗡嗡声、浮动压力){ 温度=温度; 湿度=嗡嗡声; 压力=压力; 显示(); } void display()常量{ cout

C++;观察者模式-坚持“观察者模式”;“程序到接口”;主要的 我从C++中的头设计模式实现了观察者模式,我面临一个小问题。 我在station->setnewmeasurements(0.5,10.0,7.5)行上得到错误:“类主题没有名为setnewmeasurements的成员” 如果我想使用多态性,那么应该在接口(“Subject”)中定义方法“setnewmeasurements”。但是这违反了“编程到接口”的原则,我真的需要多态性来让观察者模式在这里工作。有什么意见吗?谢谢你 #include <iostream> #include <string> #include <vector> #include <algorithm> #include <iterator> using namespace std; /************************************************** *************** Interfaces ****************** ***************************************************/ class Observer { public: virtual void update(float temp, float humidity, float pressure) = 0 ; }; class Subject { protected: vector<Observer*> observers; //est-ce une bonne idée ici? c'est contraire au pattern strategy (separate changing elements from constant ones) -> Visiblement c'est ce qui est fait dans l'UML page 56 public: virtual void registerObserver(Observer* o) = 0; virtual void removeObserver(Observer* o) = 0; virtual void notifyObserver() = 0; }; class DisplayElement { public: virtual void display() const = 0 ; }; /************************************************** ************* Implementations *************** ***************************************************/ class WeatherData : public Subject { private: float temperature; float humidity; float pressure; public: virtual void registerObserver(Observer* o){ observers.push_back(o); //y'a as un probleme la? } virtual void removeObserver(Observer* o){ std::vector<Observer*>::iterator position=std::find(observers.begin(), observers.end(), o); if (position != observers.end()) observers.erase(position); } virtual void notifyObserver() { for (vector<Observer*>::iterator it=observers.begin() ; it!=observers.end() ; it++) { (*it)->update(temperature, humidity, pressure); } } void measurmentChanged() { notifyObserver(); } void setNewMeasurments(float temp, float hum, float press) { this->temperature=temp; this->humidity=hum; this->pressure=press; measurmentChanged(); } }; class CurrentConditionsDisplay : public Observer, public DisplayElement { private: float temperature; float humidity; float pressure; Subject* weatherData; // Faut penser à désallouer cette mémoire dans le destructeur --> exercice!! (le faire à la main puis utiliser le Wrapper) public: CurrentConditionsDisplay(Subject* w){ weatherData=w; weatherData->registerObserver(this); } void update(float temp, float hum, float press){ temperature=temp; humidity=hum; pressure=press; display(); } void display() const { cout << "Current Conditions Displayers " << endl << endl; cout << "Temperature : " << temperature << endl; cout << "Humidity : " << temperature << endl; cout << "Pressure : " << temperature << endl; }; }; int main() { Subject* station=new WeatherData; CurrentConditionsDisplay mDisp(station); station->setNewMeasurments(0.5,10.0, 7.5); delete station; system("PAUSE"); return 0; } #包括 #包括 #包括 #包括 #包括 使用名称空间std; /************************************************** ***************接口****************** ***************************************************/ 类观察员 { 公众: 虚拟空隙更新(浮子温度、浮子湿度、浮子压力)=0; }; 班级科目 { 受保护的: 向量观察家;//est ce une bonne idée ici?c'est contraire au模式策略(将不断变化的元素与不变的元素分开)->Visiblement c'est ce qui est fait dans l'UML第56页 公众: 虚拟无效注册表观察者(观察者*o)=0; 虚拟空洞移除观察者(观察者*o)=0; 虚拟观察者()=0; }; 类显示元素 { 公众: 虚空显示()常量=0; }; /************************************************** *************实现*************** ***************************************************/ 班级天气数据:公共科目 { 私人: 浮子温度; 浮子湿度; 浮子压力; 公众: 虚拟无效注册表观察者(观察者*o){ 观察家们。推回(o);//你们是不是有问题? } 虚拟无效移除观察者(观察者*o){ std::vector::iterator position=std::find(observer.begin(),observer.end(),o); if(position!=observators.end()) 删除(位置); } 虚拟观察者() { for(vector::iterator it=observators.begin();it!=observators.end();it++) { (*it)->更新(温度、湿度、压力); } } 无效度量值已更改(){ notifyObserver(); } 无效设置新测量值(浮动温度、浮动嗡嗡声、浮动压力) { 这个->温度=温度; 这->湿度=嗡嗡声; 这个->压力=压力; 测量改变(); } }; 类CurrentConditionsDisplay:公共观察者,公共显示元素 { 私人: 浮子温度; 浮子湿度; 浮子压力; 主题*天气数据; //这句话的意思是:“破坏者”的意思是“施法者”。(包装物的主要利用者) 公众: 当前条件显示(主题*w){ 天气数据=w; weatherData->registerObserver(此); } 无效更新(浮动温度、浮动嗡嗡声、浮动压力){ 温度=温度; 湿度=嗡嗡声; 压力=压力; 显示(); } void display()常量{ cout,c++,design-patterns,C++,Design Patterns,这就是polimorphism的工作原理!如果将对象声明为主题,则只能访问主题的函数及其基类函数 如果需要调用函数setnewmeasurements,则需要通过将变量station声明为WeatherData来访问该函数 我认为您实际上试图实现的是隐藏WeatherData的实现,而不是整个类。您可以通过移动*.cpp文件中的函数实现来实现这一点。因此,您将只在*.h文件中包含函数定义,而在*.cpp文件中包含实际代码。这里的问题是当你写作时: Subject* station=new We

这就是polimorphism的工作原理!如果将对象声明为
主题
,则只能访问
主题
的函数及其基类函数

如果需要调用函数
setnewmeasurements
,则需要通过将变量
station
声明为
WeatherData
来访问该函数


我认为您实际上试图实现的是隐藏
WeatherData的实现,而不是整个类。您可以通过移动*.cpp文件中的函数实现来实现这一点。因此,您将只在*.h文件中包含函数定义,而在*.cpp文件中包含实际代码。

这里的问题是当你写作时:

 Subject* station=new WeatherData;
您告诉编译器,
是一个主题,主题不定义名为
setnewmeasurements
的函数

您必须将POINTER
电台
回退至
气象数据

((WeatherData*)station)->setNewMeasurments(0.5,10.0, 7.5);

或在真正的C++中,正如CoffeeandCode指出的:

static_cast<WeatherData*>(station)->setNewMeasurments(0.5,10.0, 7.5);

稍后我将讨论内存管理(可能使用包装器),这里不需要使用基类
Subject
,也不需要使用指针(无论如何,对于这个简单的测试都不需要)。只需将
作为
天气数据
的一个实例。哦,是的,这样我就可以做天气数据*站=新的天气数据,一切正常!!!谢谢much@JasBeck但是不要。尽可能使用引用和堆栈。你不知道它有多快。@CoffeeandCode但是我如何在没有任何指针的情况下使用多态性?。。。而且可能应该使用
dynamic_cast
而不是c风格的cast。我同意,这看起来非常简单!
WeatherData* station=new WeatherData;
CurrentConditionsDisplay mDisp(station);
station->setNewMeasurments(0.5,10.0, 7.5);