Menu
Coddy logo textTech

Instanz- vs. statische Member

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

Bisher gehört jede von dir erstellte Membervariable zu einem bestimmten Objekt. Wenn du zwei Player-Objekte erstellst, hat jedes seinen eigenen name- und health-Wert. Diese werden als Instanzmember bezeichnet – sie existieren für jede Instanz der Klasse separat.

Aber was, wenn du Daten benötigst, die von allen Objekten gemeinsam genutzt werden? Zum Beispiel, um zu verfolgen, wie viele Spieler insgesamt existieren.

Hier kommen statische Member ins Spiel. Ein statisches Member gehört zur Klasse selbst, nicht zu einem bestimmten Objekt.

class Player {
    std::string name;           // Instanzmitglied - jeder Spieler hat sein eigenes
    int health;                 // Instanzmitglied
    
    static int playerCount;     // Statisches Mitglied - von ALLEN Spielern geteilt
    
public:
    Player(std::string n) : name(n), health(100) {
        playerCount++;          // Erhöhen, wenn ein Spieler erstellt wird
    }
    
    ~Player() {
        playerCount--;          // Verringern, wenn ein Spieler zerstört wird
    }
};

Der entscheidende Unterschied: Auf Instanzmitglieder wird über ein Objekt zugegriffen, während auf statische Mitglieder über den Klassennamen selbst zugegriffen werden kann. Betrachte Instanzmitglieder als „eines pro Objekt“ und statische Mitglieder als „eines pro Klasse“.

InstanzmitgliederStatische Mitglieder
Für jedes Objekt einzigartigÜber alle Objekte hinweg geteilt
Werden erstellt, wenn das Objekt erstellt wirdExistieren, bevor ein Objekt erstellt wird
Zugriff über das Objekt: player.healthZugriff über die Klasse: Player::playerCount

Statische Member sind nützlich für Zähler, Konfigurationswerte oder beliebige Daten, die logisch zur Klasse und nicht zu einzelnen Objekten gehören.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Produktinventarsystem, das sowohl Details einzelner Produkte als auch allgemeine Inventarstatistiken mithilfe von Instanz- und statischen Membern erfasst.

Du wirst zwei Dateien erstellen, um deinen Code zu organisieren:

  • Product.h: Definiere eine Product-Klasse, die einzelne Produkte verwaltet und gleichzeitig Daten für das gesamte Inventar erfasst. Deine Klasse sollte Folgendes enthalten:
    • Instanzmember: name (String) und price (double): für jedes Produkt einzigartig
    • Ein statisches Member totalProducts, das zählt, wie viele Produkte derzeit existieren
    • Ein statisches Member totalValue, das den Gesamtpreis aller Produkte erfasst
    • Einen Konstruktor, der einen Namen und einen Preis entgegennimmt, die Instanzmember initialisiert und beide statischen Zähler aktualisiert (Anzahl erhöhen, Preis zum Gesamtwert addieren)
    • Einen Destruktor, der die statischen Zähler aktualisiert, wenn ein Produkt entfernt wird (Anzahl verringern, Preis vom Gesamtwert abziehen)
    • Eine getInfo()-Methode, die einen String im folgenden Format zurückgibt: "<name>: $<price>"
    • Eine statische Methode getInventoryStats(), die einen String zurückgibt: "Products: <count>, Total Value: $<value>"
  • main.cpp: Zeige, wie statische Member von allen Objekten gemeinsam genutzt werden, während Instanzmember einzigartig bleiben. Lies zwei Produktnamen und deren Preise aus der Eingabe ein (name1, price1, name2, price2: jeweils in einer eigenen Zeile), und:
    • Gib die anfänglichen Inventarstatistiken mithilfe des Klassennamens aus: Product::getInventoryStats()
    • Erstelle mit geschweiften Klammern einen Gültigkeitsbereich und darin ein Product mit dem ersten Namen und Preis. Gib dessen Informationen und die aktuellen Inventarstatistiken aus.
    • Nachdem der Block endet (das erste Produkt zerstört wurde), gib "After first scope:" gefolgt von den Inventarstatistiken aus
    • Erstelle ein weiteres Product mit dem zweiten Namen und Preis. Gib dessen Informationen und die Inventarstatistiken aus.
    • Erstelle ein drittes Product mit dem Namen "Bonus" und dem Preis 5.00. Gib die abschließenden Inventarstatistiken aus.

Denke daran, deine statischen Member außerhalb der Klasse in der Header-Datei zu definieren (nach der Klassendefinition). Formatiere Preise mit zwei Dezimalstellen mithilfe von std::fixed und std::setprecision(2) aus <iomanip>.

Binde deine Header-Datei in main.cpp mithilfe von #include "Product.h" ein.

Probier es selbst

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

using namespace std;

int main() {
    // Eingabe lesen
    string name1;
    double price1;
    string name2;
    double price2;
    
    getline(cin, name1);
    cin >> price1;
    cin.ignore();
    getline(cin, name2);
    cin >> price2;
    
    // TODO: Initiale Inventarstatistiken mit Product::getInventoryStats() ausgeben
    
    // TODO: Einen Scope-Block mit geschweiften Klammern erstellen
    // Innerhalb des Blocks:
    //   - Ein Product mit name1 und price1 erstellen
    //   - Seine Info mit getInfo() ausgeben
    //   - Aktuelle Inventarstatistiken ausgeben
    
    // TODO: After the block ends, print "After first scope:"
    // Dann die Inventarstatistiken ausgeben
    
    // TODO: Ein weiteres Product mit name2 und price2 erstellen
    // Seine Info und die Inventarstatistiken ausgeben
    
    // TODO: Ein drittes Product mit dem Namen "Bonus" und dem Preis 5.00 erstellen
    // Die finalen Inventarstatistiken 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

Übe selbstständig: Online-C++-Compiler