Pakiet programów do zdalnego nauczania Programowania Orientowanego Obiektowo
Dzisiaj jest
Poniedziałek, 16 Lipiec 2018
Zarejestrowanych użytkowników: 4
Dostępnych pytań testowych: 102
HOME
Strona tytułowa pracy dyplomowej
NAUKA
Materiały dydaktyczne związane z OOP
TESTY
Sprawdzenie poziomu zdobytej wiedzy
ZASOBY
Literatura i zasoby sieciowe o OOP
ŹRÓDŁA
Zbiór projektów dydaktycznych z OOP
KONTO
Możliwość śledzenia własnych postępów
INFO



Pamiątka jako składowa klasy

W poprzednim przykładzie obiekt pamiątki był tworzony na żądanie. Po wywołaniu metody stworzPamiatke() na podstawie wartości składowych klasy Proces utworzony jest odpowiedni obiekt pamiątki. Nic nie stoi jednak na przeszkodzie, aby w szczególnych przypadkach pamiątki były składowymi klasy i istniały przez cały czas istnienia jej instancji. Użytkownik żądający pamiątki otrzymywałby ich kopię.

Zaletą takiego rozwiązania jest atomowość tworzenia i przywracania stanów. W poprzednich dwóch przykładach zapisywany stan stanowił kompozycję trzech składowych – list typu std::deque<double> w których umieszczone były poprzednie wartości odpowiednich wielkości. Operacja wczytywania stanu sprowadzała się do trzech instrukcji przypisania. Jeśli drugi lub trzecia z tych instrukcji spowodowałaby wyjątek, wówczas proces pozostał by w błędnym stanie. Podczas, gdy pamięć poprzednich wejść obiektu byłaby skojarzona z wczytanym stanem, to np. pamięć wyjść i pamięć wygenerowanego szumu dotyczyłaby dalej stanu sprzed wykonania operacji wczytajPamiatke(). Tego typu sytuacja jest wysoce niepożądana. Co prawda można jej zapobiegać odpowiednio modyfikując implementację metody wczytajPamiatke(), ale przedstawione dalej rozwiązanie jest o wiele bardziej eleganckie.

Jeśli podczas tworzenia kopii pamiątki wystąpi wyjątek to operacja przypisania nie zostanie wykonana. Jeśli wyjątek zostanie wyłapany za wyższym poziomie i program będzie zdolny kontynuować działanie obiekt Procesu pozostanie w stanie spójnym.

Postać deklaracji klasy Pamiatka wygląda teraz następująco:

class Pamiatka {
private:
	Pamiatka ();

	std::deque<double> s_pamiecU;
	std::deque<double> s_pamiecY;
	std::deque<double> s_pamiecE;

	friend class Proces;
};

Implementacja konstruktora inicjalizuje składowe, tak samo jak klasa Proces w poprzednich przykładach:

Pamiatka::Pamiatka () 
	: s_pamiecU(3, 0.0), s_pamiecY(3, 0.0), s_pamiecE(2, 0.0)
{
}
Adamik Łukasz, Politechnika Śląska w Gliwicach (AEiI) - 2010/11