Klassen: Zähler für Objekete



  • chris911 schrieb:

    Der Compiler sagt aber, dass ich static nicht für Memberfunktionen verwenden darf, die ausserhalb der Klasse definiert sind.

    in Zeile 34 das static weglassen



  • camper schrieb:

    Wer will, kapselt die Zählerfunktionalität in einer Basisklasse:

    Wollte ich auch gerade vorschlagen 👍



  • Kapselung vom Zähler in eine Basisklasse will ich eigentlich nicht.

    Habs jetzt so:

    #include<iostream>
    using namespace std;
    
    class ABC
    {
    	public:
    
    		static int counter;
    
    		ABC(){++counter;}
    		~ABC(){--counter;}
    
    		ABC(const ABC&){++counter;}
    
    		static int count(){return counter;}		
    };
    
    int ABC::counter = 0;
    
    int main()
    {
    	ABC Objekt1; //  1 Objekt wird angelegt
    	cout << Objekt1.counter << endl; // Ausgabe = 1
    	Objekt1.~ABC(); // 1. Objekt wird wieder gelöscht
    
    	ABC Objekt2; // 1 Objekt wird angelegt 
    	cout << Objekt2.counter << endl; // Ausgabe = 1
    
    system("Pause");
    return 0;
    }
    

    Ich musste aber counter in public reinstecken, weil ich sonst keinen Zugriff hätte ausserhalb der Klasse (in Zeile 18), wo ich ihn 0 setzte.



  • Den Destruktor manuell aufrufen ist bei Stackobjekten ganz ganz böse. Und warum nimmst du nicht meine count() Methode, wenn du sie weiterverwendest?

    (Übrigens bin ich davon überzeugt, dass es eine Möglichkeit gibt, die Variable private zu lassen. Ich weiß nur nicht wie.)



  • Wenn ich count nehme wird mir nur die Adresse angezeigt.

    Wie kann ich die Objektanzahl anders heruntersetzen, bzw. was bingt mir dann das Heruntersetzen im Destruktor?



  • chris911 schrieb:

    Wie kann ich die Objektanzahl anders heruntersetzen, bzw. was bingt mir dann das Heruntersetzen im Destruktor?

    Wenn du den Destruktor manuell aufrufst, nur um den Zähler herunterzusetzen, stimmt die gesamte Zählung nicht mehr (zumal das Objekt am Ende der Funktion nochmal zerstört wird). Normalerweise verläßt man sich darauf, daß das Objekt sich am Ende des Scope selbst zerstört:

    int main()
    {
      { // eigener Scope
        ABC Objekt1;
        cout<<ABC::count()<<endl;
      } // Ende des Scope - Objekt1 wird zerstört
      cout<<ABC::count()<<endl;
    }
    

  • Mod

    chris911 schrieb:

    Wie kann ich die Objektanzahl anders heruntersetzen,

    Guck dir mal Gültigkeitsbereiche an:

    int main()
    {
     {
        ABC Objekt1; //  1 Objekt wird angelegt
        cout << ABC::counter << endl; // Ausgabe = 1
     } // 1. Objekt wird wieder gelöscht
     ABC Objekt2; // 1 Objekt wird angelegt
     cout << ABC::counter << endl; // Ausgabe = 1
    
    system("Pause");
    return 0;
    }
    

    Wenn ich count nehme wird mir nur die Adresse angezeigt.

    Du hast die Klammern beim Funktionsaufruf vergessen.



  • Ich hab jetzt zum Testen mal 100 Objekte mit einem array angelgt.
    Jetzt würde ich gerne ein Objekt davon löschen. Kann ich das nicht mit delete machen?

    So hab ichs mir gedacht:

    #include<iostream>
    using namespace std;
    
    class ABC
    {
    	public:
    
    		static int counter;
    
    		ABC(){++counter;}
    		~ABC(){cout << "Objekt zerstört!" << endl; --counter;}
    
    		ABC(const ABC&){++counter;}
    
    		static int count(){return counter;}		
    };
    
    int ABC::counter = 0;
    
    int main()
    {
    
    	ABC meineObjekte[100]; // Anlegen von 100 Objekten
    
    	delete meineObjekte[3]; // Löschen eines Objektes
    
    	ABC Objekt1;  // Objekt 101
    	cout << Objekt1.count() << endl; // Ausgabe = 1 
    
    system("Pause");
    return 0;
    }
    

    Compiler-Fehler: 'ABC' kann nicht in void konvertiert werden.



  • Nein, mit delete löscht man Heap-Speicher...
    Am besten holst du dir mal ein gutes C++-Buch und arbeitest es durch.



  • @SeppJ

    edit: @theta: Gleiches Problem wie DrakoXP

    Welches Problem?

    EDIT
    Ah, i see...

    EDIT2
    Code im orginal Post korrigiert.


Anmelden zum Antworten