Statisches Klassenelement funktioniert nicht wie es soll



  • Hallo, sorry, dass ich schon wieder eine Frage habe, aber ich komme einfach nicht von selbst dahinter. 🤡
    Es geht um eine Übungsklasse Artikel, die als Elemente artikelnummer, bezeichnung und preis hat und noch ein statisches Element anzahl (static unsigned int).
    Immer wenn ein Objekt der Klasse erzeugt wird, soll diese Variable um 1 erhöht werden (also im Konstruktor) und im Destruktor wird sie um 1 verringert. Jedoch funktioniert das so nicht. Hier erstmal die Klasse:

    // artikel.h
    #ifndef ARTIKEL_H
    #define ARTIKEL_H
    #include <string>
    
    class Artikel
    {
    private:
        long artikelnummer;
        std::string bezeichnung;
        double preis;
        static unsigned int anzahl;
    public:
        Artikel(const long artikelnummer = 1110, const std::string bezeichnung = "ding", const double preis = 10.0);
        ~Artikel();
        // Weitere Getter, Setter, ...
    };
    #endif
    

    Da man die Variable ja nicht direkt einen Wert zuweisen kann, habe ich das in der Qulldatei zusammen mit Definitionen von Konstruktor, Destruktor und anderen Methoden vorgenommen:

    #include <iostream>
    // artikel.cpp
    #include <string>
    #include <iomanip>
    
    #include "artikel.h"
    
    // Deklaration statische Elemente
    unsigned int Artikel::anzahl = 0;
    
    // Deklaration Methoden
    Artikel::Artikel(long artikelnummer, const std::string bezeichnung, double preis)
    {
        this->artikelnummer = artikelnummer;
        this->bezeichnung = bezeichnung;
        this->anzahl = 0;
        preis < 0 ? (this->preis = 0.0) : (this->preis = preis);
        std::cout << "Es wird ein Objekt fuer den Artikel " << this->artikelnummer << " angelegt." << std::endl
                << "Das ist der " << ++anzahl << ". Artikel." << std::endl << std::endl;
    }
    
    Artikel::~Artikel()
    {
        std::cout << "Das Objekt fuer den Artikel " << artikelnummer << " wird zerstoert." << std::endl
                << "Es gibt noch " << --anzahl << " Artikel." << std::endl;
    }
    

    Wenn ich das Programm in folgender Datei starte:

    // artikelDemo.h
    Artikel artikel1(32423, "Apfel", 3.50); // globales Artikel-Objekt
    
    int main()
    {
        Artikel artikel2(23242, "Chips", 2.50); // lokales Objekt
        return 0;
    }
    

    Gibt es folgende Ausgabe:

    Es wird ein Objekt fuer den Artikel 32423 angelegt.
    Das ist der 1. Artikel.
    Es wird ein Objekt fuer den Artikel 23242 angelegt.
    Das ist der 1. Artikel.
    Das Objekt fuer den Artikel 23242 wird zerstoert.
    Es gibt noch 0 Artikel.
    Das Objekt fuer den Artikel 32423 wird zerstoert.
    Es gibt noch 4294967295 Artikel.
    

    Kann das jemand erklären?



  • Zeile 16 (im Artikelkonstruktor)?



  • manni66 schrieb:

    Zeile 16 (im Artikelkonstruktor)?

    Das ist es gewesen...
    Schon das zweite Mal, dass ich sowas übersehe und hier frage! Da sucht man überall nach Ursachen und dann sowas 🤡
    Hoffe, ihr könnt mir das verzeihen. 🙂
    Gruß

    Edit: Ich weiß gar nicht wieso diese Zeile überhaupt da drin war... Doof 😃


Log in to reply