
Aby zabezpieczyć nasz obiekt, przed niepożądanymi modyfikacjami, możemy dokonać, tzw. hermetyzacji lub enkapsulacji.
Polega ona na umieszczeniu wszystkich właściwości (pól) w sekcji prywatnej, a ich modyfikacje umożliwiać przez publiczne funkcje.
Najprostszymi funkcjami umożliwiającymi modyfikacje są tzw. settery.
Setter to funkcja, która przypisuje daną wartość konkretnej zmiennej.
void setName(const std::string& name) { name_ = name; }
Ponieważ dane są prywatne, ich odczyt również nie jest możliwy, więc dokonujemy go przez tzw. gettery.
std::string getName() const { return name_; }
Oczywiście nie zawsze musimy umożliwiać modyfikacje wszystkich zmiennych, tak samo, jak nie wszystkie zmienne mogą mieć swoje gettery. Wybór zależy od programisty.
Jeśli w obiektach naszej klasy chcemy sprawdzać poprawność przypisywanych danych, to settery są wręcz obowiązkowe.
void setValue(int newValue) {
if (newValue >= 0 or newValue < 100) {
value_ = newValue;
} // otherwise no effect, could also signal an error
}
Gdyby pole value_
było publiczne to taki warunek musielibyśmy sprawdzać w każdym miejscu, gdzie ustawiamy dane. Prościej jest po prostu zabronić bezpośredniego dostępu do value_
poprzez uczynienie go prywatnym i utworzenie publicznego settera jak powyżej. Dzięki temu mamy pewność, że nikt nie ustawi wartości spoza oczekiwanego zakresu.
Jeśli nie potrzebujemy kontroli danych to łatwiej jest używać pól publicznych.
Przypatrz się temu getterowi.
std::string getName() const { return name_; }
Gdzie on ma const
? Co to robi? 🤔
Odpowiemy na to pytanie po zadaniach 💻