Menu
Coddy logo textTech

Gettery i settery

Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 28 z 104.

Gdy składowe klasy są prywatne, kod zewnętrzny nie może uzyskać do nich bezpośredniego dostępu. Gettery i settery to publiczne metody zapewniające kontrolowany dostęp do tych prywatnych składowych — gettery pobierają wartości, a settery je modyfikują.

class Temperature {
    double celsius;    // Prywatne — nie można uzyskać bezpośredniego dostępu
    
public:
    // Getter — zwraca wartość
    double getCelsius() const {
        return celsius;
    }
    
    // Setter — zmienia wartość po sprawdzeniu jej poprawności
    void setCelsius(double value) {
        if (value >= -273.15) {    // Sprawdzenie zera bezwzględnego
            celsius = value;
        }
    }
};

Prawdziwa moc metod ustawiających polega na walidacji.

Zamiast pozwalać na przypisanie dowolnej wartości, możesz narzucić reguły. W powyższym przykładzie odrzucane są temperatury poniżej zera absolutnego. Bez settera każdy mógłby bezpośrednio przypisać nieprawidłowe dane.

Gettery mogą również przekształcać dane przed ich zwróceniem:

class Temperature {
    double celsius;
public:
    double getCelsius() const { return celsius; }
    
    // Getter obliczający wartość - nie przechowuje temperatury w stopniach Fahrenheita, lecz ją oblicza
    double getFahrenheit() const {
        return celsius * 9.0 / 5.0 + 32.0;
    }
    
    void setCelsius(double value) { celsius = value; }
};

Zwróć uwagę na słowo kluczowe const przy metodach pobierających — oznacza ono, że nie modyfikują one obiektu. Metody ustawiające nie mogą być oznaczone jako const, ponieważ ich celem jest zmiana wartości składowych. Ten wzorzec używania metod pobierających i ustawiających ma fundamentalne znaczenie dla enkapsulacji, dając ci pełną kontrolę nad tym, jak uzyskuje się dostęp do danych klasy i jak się je modyfikuje.

challenge icon

Wyzwanie

Łatwy

Zbudujmy system profilu gracza, który pokaże, jak metody pobierające i ustawiające zapewniają kontrolowany dostęp do prywatnych danych, w tym walidację i właściwości obliczane.

Utworzysz dwa pliki, aby uporządkować swój kod:

  • Player.h: Zdefiniuj klasę Player, która zarządza profilem postaci w grze z chronionym dostępem do danych. Twoja klasa powinna zawierać:
    • Prywatne składowe: name (string), level (int) i experience (int)
    • Konstruktor, który przyjmuje nazwę i inicjalizuje level wartością 1, a experience wartością 0
    • Metodę pobierającą getName(), która zwraca imię gracza
    • Metodę pobierającą getLevel(), która zwraca aktualny poziom
    • Metodę pobierającą getExperience(), która zwraca aktualne punkty doświadczenia
    • Metodę ustawiającą setName(), która akceptuje tylko nazwy mające co najmniej 3 znaki; jeśli nazwa jest nieprawidłowa, pozostaw aktualną nazwę bez zmian
    • Metodę ustawiającą addExperience(int points), która akceptuje tylko wartości dodatnie. Gdy doświadczenie osiągnie lub przekroczy 100, gracz awansuje na kolejny poziom: zwiększ poziom o 1 i odejmij 100 od doświadczenia. Może się to zdarzyć wielokrotnie, jeśli dodano wystarczająco dużo doświadczenia.
    • Obliczaną metodę pobierającą getExperienceToNextLevel(), która zwraca, ile punktów doświadczenia brakuje do osiągnięcia kolejnego poziomu (zawsze 100 - current experience)

    Oznacz wszystkie metody pobierające jako const, ponieważ nie modyfikują obiektu.

  • main.cpp: Pokaż działanie metod pobierających i ustawiających. Wczytaj z wejścia imię gracza i liczbę punktów doświadczenia do dodania (każde w osobnym wierszu), a następnie:
    • Utwórz obiekt Player z wczytanym imieniem
    • Wypisz "Player: <name>, Level: <level>, XP: <experience>"
    • Dodaj wczytane punkty doświadczenia za pomocą addExperience()
    • Ponownie wypisz ten sam wiersz statusu, aby pokazać zaktualizowany stan
    • Wypisz "XP to next level: <amount>"
    • Spróbuj zmienić imię na "Al" (walidacja powinna się nie powieść)
    • Wypisz "Name after invalid change: <name>"
    • Zmień imię na "Champion" (powinno się udać)
    • Wypisz "Name after valid change: <name>"

Dane wejściowe dotyczące doświadczenia zostaną podane jako ciąg znaków, który trzeba będzie przekonwertować na liczbę całkowitą. Dołącz plik nagłówkowy w main.cpp za pomocą #include "Player.h".

Spróbuj swoich sił

#include <iostream>
#include <string>
#include "Player.h"

using namespace std;

int main() {
    // Wczytaj imię gracza
    string playerName;
    getline(cin, playerName);

    // Wczytaj punkty doświadczenia do dodania (jako string, przekonwertuj na int)
    string expString;
    getline(cin, expString);
    int expToAdd = stoi(expString);

    // TODO: Utwórz obiekt Player z wczytanym imieniem

    // TODO: Wypisz stan początkowy: "Player: <name>, Level: <level>, XP: <experience>"

    // TODO: Dodaj wczytane punkty doświadczenia za pomocą addExperience()

    // TODO: Wypisz zaktualizowany wiersz stanu

    // TODO: Wypisz "XP to next level: <amount>"

    // TODO: Spróbuj zmienić imię na "Al" (walidacja powinna zakończyć się niepowodzeniem)

    // TODO: Wypisz "Name after invalid change: <name>"

    // TODO: Zmień imię na "Champion" (powinno się udać)

    // TODO: Wypisz "Name after valid change: <name>"

    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C++ online