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; }
-
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.
-
edit: @theta: Gleiches Problem wie DrakoXP
Welches Problem?
EDIT
Ah, i see...EDIT2
Code im orginal Post korrigiert.