#include <string>
class Czasomierz
{
public:
std::string model;
protected:
void setModel (std::string rhs);
virtual std::string getTrybPracy () = 0;
};
void Czasomierz::setModel (std::string rhs) { this->model = rhs; return; }
class Stoper : Czasomierz /* Błąd projektowy. Brak określonego sposobu dziedziczenia. Zastosowano dziedziczenie domyślne. */
{
private:
int sekundy;
std::string getTrybPracy ();
public:
std::string tryb;
Stoper (std::string rhs) : tryb(rhs) {}
void setTrybPracy (std::string tryb);
void setTrybOn ();
void setTrybOff ();
void addSekunda ();
int getSekundy ();
};
std::string Stoper::getTrybPracy () { return tryb; }
void Stoper::setTrybPracy (std::string tryb) { this->tryb = tryb; return; }
void Stoper::setTrybOn () { this->tryb = "ON"; }
void Stoper::setTrybOff () { this->tryb = "OFF"; }
void Stoper::addSekunda () { ++(this->sekundy); }
int Stoper::getSekundy () { return this->sekundy; }
int main ()
{
Stoper _stoper("jakis_tryb");
_stoper.setTrybPracy("inny_tryb_pracy");
_stoper.setTrybOn();
_stoper.addSekunda(); /* błąd projektowy. Zmienna "sekunda" nie ma wstępnie ustalonej wartości (czyli znajdują się w niej losowe śmieci, które wcześniej były w tym obszarze pamięci), tym samym dodawanie do niej czegokolwiek mija się z celem. Aby to naprawić, należy zmodyfikować konstruktor - np. dodać do jego listy inicjalizacyjnej zapis ", sekundy(0) ". Jest to jedyne rozwiązanie ponieważ pole "sekundy" jest prywatne (a uczynienie go publicznym byłoby jak strzał w pysk enkapsulacji). */
_stoper.getSekundy();
_stoper.setTrybOff();
return 0;
}