diff --git a/WeatherData/weatherdata.cpp b/WeatherData/weatherdata.cpp index 5cd5573..8f252e7 100644 --- a/WeatherData/weatherdata.cpp +++ b/WeatherData/weatherdata.cpp @@ -8,7 +8,7 @@ using std::vector; class Observer { public: - virtual void update(float temp, float humidity, float pressure) = 0; + virtual void update() = 0; }; class Subject { @@ -16,6 +16,10 @@ class Subject { virtual void registerObserver(Observer* observer) = 0; virtual void removeObserver(Observer* observer) = 0; virtual void notifyObservers() = 0; + + [[nodiscard]] virtual float getTemperature() const = 0; + [[nodiscard]] virtual float getHumidity() const = 0; + [[nodiscard]] virtual float getPressure() const = 0; }; class DisplayElement { @@ -34,10 +38,9 @@ class CurrentConditionsDisplay : public Observer, DisplayElement { cout << "Current conditions: " << temperature_ << " C degrees and " << humidity_ << "% humidity" << '\n'; } - void update(float temp, float humidity, float pressure) override { - temperature_ = temp; - humidity_ = humidity; - (void)pressure; + void update() override { + temperature_ = weatherData_->getTemperature(); + humidity_ = weatherData_->getHumidity(); display(); } @@ -59,21 +62,20 @@ class StatisticsDisplay : public Observer, DisplayElement { cout << "Avg/Max/Min: " << average_temp_ << '/' << max_temp_ << '/' << min_temp_ << '\n'; } - void update(float temp, float humidity, float pressure) override { - temperature_ = temp; - humidity_ = humidity; - pressure_ = pressure; - temps_.push_back(temp); - if (temp > max_temp_) { - max_temp_ = temp; + void update() override { + float temperature_ = weatherData_->getTemperature(); + + temps_.push_back(temperature_); + if (temperature_ > max_temp_) { + max_temp_ = temperature_; } - if (temp < min_temp_) { - min_temp_ = temp; + if (temperature_ < min_temp_) { + min_temp_ = temperature_; } float sum_temp = 0.0; - for (float temperature: temps_) { - sum_temp += temperature; + for (float temp : temps_) { + sum_temp += temp; } if (!temps_.empty()) { average_temp_ = sum_temp / temps_.size(); @@ -85,10 +87,6 @@ class StatisticsDisplay : public Observer, DisplayElement { private: Subject* weatherData_; - float temperature_ = 0.0; - float humidity_ = 0.0; - float pressure_ = 0.0; - float min_temp_ = 273; float max_temp_ = -273; float average_temp_ = 0.0; @@ -106,17 +104,14 @@ class ForecastDisplay : public Observer, DisplayElement { cout << "Tomorrow will be a good day (50%)" << '\n'; } - void update(float temp, float humidity, float pressure) override { - (void)temp; - (void)humidity; - pressure_ = pressure; + void update() override { + pressures_.push_back(weatherData_->getPressure()); display(); } private: Subject* weatherData_; - - float pressure_ = 0.0; + vector pressures_; }; class WeatherData : public Subject { @@ -129,7 +124,7 @@ class WeatherData : public Subject { } void notifyObservers() override { for (auto* observer : observers_) { - observer->update(temperature_, humidity_, pressure_); + observer->update(); } } @@ -145,6 +140,18 @@ class WeatherData : public Subject { measurementsChanged(); } + [[nodiscard]] float getTemperature() const override { + return temperature_; + } + + [[nodiscard]] float getHumidity() const override { + return humidity_; + } + + [[nodiscard]] float getPressure() const override { + return pressure_; + } + private: set observers_; float temperature_ = 0.0;