Menu
Coddy logo textTech

Metody i zmienne statyczne

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

Wiesz już, że składowe statyczne są współdzielone przez wszystkie obiekty. Teraz przyjrzyjmy się, jak prawidłowo definiować i używać metod statycznych razem ze zmiennymi statycznymi.

Zmienne statyczne zadeklarowane wewnątrz klasy muszą być definiowane poza klasą, zazwyczaj w pliku źródłowym. Dzieje się tak, ponieważ składowe statyczne potrzebują dokładnie jednego miejsca przechowywania współdzielonego przez wszystkie obiekty:

class Counter {
    static int count;    // Tylko deklaracja
    
public:
    Counter() { count++; }
    ~Counter() { count--; }
    
    static int getCount() {    // Metoda statyczna
        return count;
    }
};

// Definicja – wymagana poza klasą
int Counter::count = 0;

Metoda statyczna należy do klasy, a nie do żadnego obiektu. Ma to ważną konsekwencję: metody statyczne nie mogą uzyskiwać dostępu do składowych instancji ani używać wskaźnika this, ponieważ nie są wywoływane na żadnym konkretnym obiekcie.

class MathUtils {
    static double pi;
    
public:
    static double circleArea(double radius) {
        return pi * radius * radius;    // Może uzyskiwać dostęp do składowych statycznych
    }
};

double MathUtils::pi = 3.14159;

// Wywoływana bez obiektu
double area = MathUtils::circleArea(5.0);

Metody statyczne są idealne do funkcji pomocniczych, które nie wymagają stanu obiektu, metod fabrykujących tworzących obiekty lub uzyskiwania dostępu do danych statycznych. Ponieważ nie wymagają instancji obiektu, wywołujesz je, używając nazwy klasy i operatora rozstrzygania zakresu: ClassName::methodName().

challenge icon

Wyzwanie

Łatwy

Zbudujmy system generowania unikalnych identyfikatorów, który pokazuje, jak metody i zmienne statyczne współpracują, zapewniając funkcjonalność na poziomie klasy bez potrzeby tworzenia jej obiektów.

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

  • IDGenerator.h: Zdefiniuj klasę IDGenerator, która generuje kolejne unikalne identyfikatory. Twoja klasa powinna zawierać:
    • Prywatny statyczny składowy nextId, który śledzi kolejny identyfikator do przypisania (zaczyna od 1000)
    • Prywatny statyczny składowy prefix (łańcuch znaków), który przechowuje konfigurowalny prefiks dla wszystkich identyfikatorów
    • Metodę statyczną setPrefix(const std::string& p), która zmienia prefiks
    • Metodę statyczną getNextId(), która zwraca łańcuch znaków łączący prefiks z bieżącym numerem identyfikatora, a następnie zwiększa wartość nextId na potrzeby następnego wywołania
    • Metodę statyczną peekNextId(), która zwraca wartość następnego identyfikatora bez zwiększania licznika
    • Metodę statyczną getGeneratedCount(), która zwraca liczbę wygenerowanych identyfikatorów (podpowiedź: oblicz ją na podstawie wartości początkowej i bieżącej wartości nextId)
    • Metodę statyczną reset(), która ustawia wartość nextId z powrotem na 1000

    Pamiętaj, aby zdefiniować składowe statyczne poza klasą, po definicji klasy. Zainicjuj prefix wartością "ID-".

  • main.cpp: Pokaż wywoływanie metod statycznych za pomocą nazwy klasy, bez tworzenia żadnych obiektów. Wczytaj niestandardowy prefiks z wejścia, a następnie:
    • Wyświetl "Peek: <peeked_id>", używając peekNextId()
    • Wygeneruj trzy identyfikatory za pomocą getNextId() i wyświetl każdy z nich jako "Generated: <id>"
    • Wyświetl "Count: <count>", pokazując liczbę wygenerowanych identyfikatorów
    • Zmień prefiks, używając wczytanej wartości i setPrefix()
    • Wygeneruj dwa kolejne identyfikatory i wyświetl każdy z nich jako "Generated: <id>"
    • Ponownie wyświetl "Count: <count>"
    • Wywołaj reset()
    • Wyświetl "After reset - Peek: <peeked_id>"
    • Wyświetl "After reset - Count: <count>"

Zauważ, że nigdy nie tworzysz obiektu IDGenerator: wszystkie metody są wywoływane bezpośrednio na klasie za pomocą IDGenerator::methodName(). To kluczowa cecha metod statycznych: należą do samej klasy, a nie do żadnej konkretnej instancji.

Dołącz <string> i <iostream> w pliku nagłówkowym i nie zapomnij o strażnikach nagłówka.

Spróbuj swoich sił

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

using namespace std;

int main() {
    // Wczytaj niestandardowy prefiks z wejścia
    string customPrefix;
    cin >> customPrefix;
    
    // TODO: Wypisz "Peek: <peeked_id>" za pomocą peekNextId()
    
    // TODO: Wygeneruj trzy identyfikatory za pomocą getNextId() i wypisz każdy w formacie "Generated: <id>"
    
    // TODO: Wypisz "Count: <count>", pokazując, ile identyfikatorów wygenerowano
    
    // TODO: Zmień prefiks na wartość z wejścia za pomocą setPrefix()
    
    // TODO: Wygeneruj jeszcze dwa identyfikatory i wypisz każdy w formacie "Generated: <id>"
    
    // TODO: Ponownie wypisz "Count: <count>"
    
    // TODO: Wywołaj reset()
    
    // TODO: Wypisz "After reset - Peek: <peeked_id>"
    
    // TODO: Wypisz "After reset - Count: <count>"
    
    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