C++/Konstruktor i destruktor: Różnice pomiędzy wersjami

Usunięta treść Dodana treść
Aysorth (dyskusja | edycje)
m Ujednolicenie wyglądu kodu (spacje przed i po operatorach)
+delegacja konstruktorów
Linia 146:
</source>
}}
 
===Delegacja konstruktorów (C++11)===
 
W przypadku wielu wariantów konstruktorów często zdarza się, że muszą one powielać różne testy poprawności argumentów lub jakieś szczególne operacje konieczne do inicjalizacji obiektu. Niekiedy taki wspólny kod wyciąga się do osobnych prywatnych lub chronionych metod.
 
W C++ dodano możliwość użycia na liście inicjalizacyjnej innych konstruktorów klasy.
 
Przyjrzyjmy się poniższej klasie - ma ona za zadanie przechowywać szczegóły dotyczące błędów składniowych np. w pliku konfiguracyjnym. Przechowuje numer linii, nazwę pliku i komunikat. Niekiedy jednak pliku nie ma, bo dane czytamy ze standardowego wejścia; czasem numer linii też nie jest dostępny, bo np. dopiero po przeczytaniu całego pliku wiadomo, że jest coś nie tak w strukturze.
 
Klasa zrealizowana bez delegacji konstruktorów.
 
<source lang="cpp">
class BladSkladniowy {
int numer_linii;
std::string plik;
std::string komunikat;
 
BladSkladniowy(int numer_linii, const std::string& plik, const std::string& komunikat)
: numer_linii(numer_linii)
, plik(plik)
, komunikat(komunikat) {
 
if (numer_linii < 0) throw "niepoprawny numer linii";
if (plik.empty()) throw "nazwa pliku nie może być pusta";
if (komunikat.empty()) throw "komunikat nie może być pusty";
}
 
BladSkladniowy(int numer_linii, const std::string& komunikat)
: numer_linii(numer_linii)
, plik("<standardowe wejście>")
, komunikat(komunikat) {
 
if (numer_linii < 0) throw "niepoprawny numer linii";
if (komunikat.empty()) throw "komunikat nie może być pusty";
}
 
BladSkladniowy(const std::string& komunikat)
: numer_linii(0)
, plik("<standardowe wejście>")
, komunikat(komunikat) {
 
if (komunikat.empty()) throw "komunikat nie może być pusty";
}
};
</source>
 
Przy użyciu delegacji kod skraca się znacząco:
 
<source lang="cpp">
class BladSkladniowy {
int numer_linii;
std::string plik;
std::string komunikat;
 
BladSkladniowy(int numer_linii, const std::string& plik, const std::string& komunikat)
: numer_linii(numer_linii)
, plik(plik)
, komunikat(komunikat) {
 
if (numer_linii < 0) throw "niepoprawny numer linii";
if (plik.empty()) throw "nazwa pliku nie może być pusta";
if (komunikat.empty()) throw "komunikat nie może być pusty";
}
 
BladSkladniowy(int numer_linii, const std::string& komunikat)
: BladSkladniowy(numer_linii, "<standardowe wejście>", komunikat) {}
 
BladSkladniowy(const std::string& komunikat)
: BladSkladniowy(0, komunikat) {}
};
</source>
 
 
=== Destruktor ===