Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>A more pattern oriented solution (but without function pointers) could be the following. You could parametrize the WeatherObserver-Class to get only the values, you want. </p> <pre><code>#include &lt;list&gt; #include &lt;iostream&gt; class Observable; //forward declaration //Base class for all observers class Observer { friend class Observable; //allow access to observedSubject protected: Observable *observedSubject; public: virtual void update(){}; }; //Base class for all observables class Observable { private: std::list&lt;Observer * const&gt; m_registeredObservers; public: ~Observable() { //delete the observers std::list&lt;Observer * const&gt;::iterator it = m_registeredObservers.begin(); while (it != m_registeredObservers.end()) { delete *it; it = m_registeredObservers.erase(it); } } void addObserver(Observer * const _pObserver) { _pObserver-&gt;observedSubject = this; m_registeredObservers.push_back(_pObserver); } void removeObserver(Observer * const _pObserver) { m_registeredObservers.remove(_pObserver); delete _pObserver; } void notifyObservers() { std::list&lt;Observer * const&gt;::iterator it = m_registeredObservers.begin(); while (it != m_registeredObservers.end()) { (*it)-&gt;update(); it++; } } }; //Concrete Observable class WeatherData : public Observable { private: float temperature; float humidity; float pressure; public: WeatherData(): temperature(0), humidity(0), pressure(0) {}; float getTemperature () const { return temperature; } float getHumidity () const { return humidity; } float getPressure () const { return pressure; } void setTemperature(float _temperature) { if (temperature != _temperature) { temperature = _temperature; notifyObservers(); } } void setHumidity(float _humidity) { if (humidity != _humidity) { humidity = _humidity; notifyObservers(); } } void setPressure(float _pressure) { if (pressure != _pressure) { pressure = _pressure; notifyObservers(); } } }; //Concrete implementation of an weather observer class WeatherObserver : public Observer { public: WeatherObserver():Observer(){}; void update() { WeatherData* pWeatherPtr = static_cast&lt;WeatherData*&gt;(observedSubject); if (pWeatherPtr != 0) { float actHumidity = pWeatherPtr-&gt;getHumidity(); float actPressure = pWeatherPtr-&gt;getPressure(); float actTemperature = pWeatherPtr-&gt;getTemperature(); //do something with the data std::cout &lt;&lt; "WeatherObserver update" &lt;&lt; std::endl; std::cout &lt;&lt; "Temperature : " &lt;&lt; actTemperature &lt;&lt; std::endl; std::cout &lt;&lt; "Humidity : " &lt;&lt; actHumidity &lt;&lt; std::endl; std::cout &lt;&lt; "Pressure : " &lt;&lt; actPressure &lt;&lt; std::endl; } } }; int main() { WeatherData weatherData; Observer * pObserver = new WeatherObserver(); weatherData.addObserver(pObserver); weatherData.setHumidity(100); weatherData.setTemperature(100); } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload