Menu
Coddy logo textTech

Statische Methoden und Variablen

Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 31 von 104.

Du hast gelernt, dass statische Member von allen Objekten gemeinsam genutzt werden. Lass uns nun untersuchen, wie man statische Methoden zusammen mit statischen Variablen richtig definiert und verwendet.

Statische Variablen, die innerhalb einer Klasse deklariert werden, müssen außerhalb der Klasse definiert werden, normalerweise in einer Quelldatei. Dies liegt daran, dass statische Member genau einen Speicherort benötigen, der von allen Objekten gemeinsam genutzt wird:

class Counter {
    static int count;    // Nur Deklaration
    
public:
    Counter() { count++; }
    ~Counter() { count--; }
    
    static int getCount() {    // Statische Methode
        return count;
    }
};

// Definition - außerhalb der Klasse erforderlich
int Counter::count = 0;

Eine statische Methode gehört zur Klasse, nicht zu einem Objekt. Dies hat eine wichtige Konsequenz: Statische Methoden können nicht auf Instanzmitglieder zugreifen oder den this-Pointer verwenden, da sie nicht für ein bestimmtes Objekt aufgerufen werden.

class MathUtils {
    static double pi;
    
public:
    static double circleArea(double radius) {
        return pi * radius * radius;    // Kann auf statische Member zugreifen
    }
};

double MathUtils::pi = 3.14159;

// Ohne ein Objekt aufgerufen
double area = MathUtils::circleArea(5.0);

Statische Methoden eignen sich ideal für Hilfsfunktionen, die keinen Objektzustand benötigen, Factory-Methoden, die Objekte erstellen, oder den Zugriff auf statische Daten. Da sie keine Objektinstanz erfordern, rufen Sie sie unter Verwendung des Klassennamens und des Bereichsauflösungsoperators auf: ClassName::methodName().

challenge icon

Aufgabe

Einfach

Lassen Sie uns ein System zur Generierung eindeutiger IDs erstellen, das demonstriert, wie statische Methoden und Variablen zusammenarbeiten, um Funktionalität auf Klassenebene bereitzustellen, ohne dass Objektinstanzen erforderlich sind.

Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:

  • IDGenerator.h: Definieren Sie eine Klasse IDGenerator, die sequenzielle eindeutige IDs generiert. Ihre Klasse sollte Folgendes enthalten:
    • Ein privates statisches Mitglied nextId, das die nächste zuzuweisende ID verfolgt (beginnt bei 1000)
    • Ein privates statisches Mitglied prefix (String), das ein anpassbares Präfix für alle IDs speichert
    • Eine statische Methode setPrefix(const std::string& p), die das Präfix ändert
    • Eine statische Methode getNextId(), die einen String zurückgibt, der das Präfix und die aktuelle ID-Nummer kombiniert, und dann nextId für den nächsten Aufruf inkrementiert
    • Eine statische Methode peekNextId(), die zurückgibt, wie die nächste ID aussehen würde, ohne den Zähler zu inkrementieren
    • Eine statische Methode getGeneratedCount(), die zurückgibt, wie viele IDs generiert wurden (Hinweis: Berechnen Sie dies aus dem Startwert und der aktuellen nextId)
    • Eine statische Methode reset(), die nextId wieder auf 1000 zurücksetzt

    Denken Sie daran, Ihre statischen Mitglieder außerhalb der Klasse nach der Klassendefinition zu definieren. Initialisieren Sie prefix mit "ID-".

  • main.cpp: Demonstrieren Sie den Aufruf statischer Methoden unter Verwendung des Klassennamens, ohne Objekte zu erstellen. Lesen Sie ein benutzerdefiniertes Präfix aus der Eingabe und führen Sie dann Folgendes aus:
    • Geben Sie "Peek: <peeked_id>" unter Verwendung von peekNextId() aus
    • Generieren Sie drei IDs mit getNextId() und geben Sie jede als "Generated: <id>" aus
    • Geben Sie "Count: <count>" aus, um anzuzeigen, wie viele IDs generiert wurden
    • Ändern Sie das Präfix mit dem Eingabewert über setPrefix()
    • Generieren Sie zwei weitere IDs und geben Sie jede als "Generated: <id>" aus
    • Geben Sie erneut "Count: <count>" aus
    • Rufen Sie reset() auf
    • Geben Sie "After reset - Peek: <peeked_id>" aus
    • Geben Sie "After reset - Count: <count>" aus

Beachten Sie, dass Sie niemals ein IDGenerator-Objekt erstellen — alle Methoden werden direkt über die Klasse mit IDGenerator::methodName() aufgerufen. Dies ist das Hauptmerkmal statischer Methoden: Sie gehören zur Klasse selbst und nicht zu einer bestimmten Instanz.

Binden Sie <string> und <iostream> in Ihre Header-Datei ein und vergessen Sie die Header-Guards nicht.

Probier es selbst

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

using namespace std;

int main() {
    // Benutzerdefiniertes Präfix von der Eingabe lesen
    string customPrefix;
    cin >> customPrefix;
    
    // TODO: "Peek: <peeked_id>" mit peekNextId() ausgeben
    
    // TODO: Drei IDs mit getNextId() generieren und jede als "Generated: <id>" ausgeben
    
    // TODO: "Count: <count>" ausgeben, um anzuzeigen, wie viele IDs generiert wurden
    
    // TODO: Das Präfix mit dem Eingabewert über setPrefix() ändern
    
    // TODO: Zwei weitere IDs generieren und jede als "Generated: <id>" ausgeben
    
    // TODO: "Count: <count>" erneut ausgeben
    
    // TODO: reset() aufrufen
    
    // TODO: "After reset - Peek: <peeked_id>" ausgeben
    
    // TODO: "After reset - Count: <count>" ausgeben
    
    return 0;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung