c++ für Dummies
-
#include <iostream> using namespace std; class Klasse{ public: Klasse() { zup(-1); }; ~Klasse() { zup(1); }; int zup(int num){ static int InstanzZaehler; InstanzZaehler -= num; return InstanzZaehler; } }; int main() { Klasse *a = new Klasse(); cout << a->zup(0) << endl; Klasse *b = new Klasse(); cout << a->zup(0) << endl; Klasse *c = new Klasse(); cout << a->zup(0) << endl; delete a; cout << a->zup(0) << endl; delete b; cout << a->zup(0) << endl; delete c; cout << a->zup(0) << endl; return 0; }lg lolo
-
nicht das noch jemand auf die idee kommt da zup() mit was anderem als ner 0 aufzurufen

class Klasse{ public: Klasse() { zup(-1); }; ~Klasse() { zup(1); }; int getZup(){ return zup(0); } private: int zup(int num){ static int InstanzZaehler; InstanzZaehler -= num; return InstanzZaehler; } }; int main() { Klasse *a = new Klasse(); cout << a->getZup() << endl; Klasse *b = new Klasse(); cout << a->getZup() << endl; Klasse *c = new Klasse(); cout << a->getZup() << endl; delete a; cout << a->getZup() << endl; delete b; cout << a->getZup() << endl; delete c; cout << a->getZup() << endl; return 0; }lg lolo
-
Theorettich hätte ich das auch so, nur bekomme ich immer die undefinierte Referenz.
D.h. wenn ich
static int MyIndex;
habe und dies der Welt über
int Index () {
return MyIndex;
}
mitteilen will, kommt ein Kompilierfehler. Linkerror undefined reference
Die Erhöhung sei hier unbenommen, da es keine ANSI-Regel gibt, die 0-Zähler verbieten würde :-))
-
Der Supercoder schrieb:
Theorettich hätte ich das auch so, nur bekomme ich immer die undefinierte Referenz.
D.h. wenn ich
static int MyIndex;
habe und dies der Welt über
int Index () {
return MyIndex;
}
mitteilen will, kommt ein Kompilierfehler. Linkerror undefined reference
Die Erhöhung sei hier unbenommen, da es keine ANSI-Regel gibt, die 0-Zähler verbieten würde :-))
du nimmst mir das nicht übel wenn ich das jetzt nicht verstanden hab oder

lg lolo
-
player4245 schrieb:
Eine Klasse mit Instanzzähler ist ganz einfach:
class Klasse { private: static int InstanzZaehler; public: Klasse() { ++InstanzZaehler; } ~Klasse() { --InstanzZaehler } int InstanzZahl() { return InstanzZaehler; } };{ Klasse a; Klasse b(a); }Huch, minus eine Instanz. Ganz so einfach ist es scheinbar doch nicht.

-
Klasse b(a);was hat das für ein effect? kopiert das a in b?
-
noobLolo schrieb:
Klasse b(a);was hat das für ein effect? kopiert das a in b?
Das erzeugt ein neues Objekt b als Kopie von a. b existiert unabhängig von a, ist also keine Referenz oder Zeiger oder sonstwas und somit auch unbedingt Zählungswürdig!
-
noobLolo schrieb:
Klasse b(a);was hat das für ein effect? kopiert das a in b?
Das ruft den Kopierkonstruktor auf, welcher vom Compiler automatisch generiert wird.
Du musst also noch das hier einfügen:
Klasse ( const Klasse& r ) { ++InstanzZaehler; }Damit definierst du den Kopierkonstruktor selbst und kannst also auch die Instanz hoch zählen.
-
noobLolo schrieb:
Klasse b(a);was hat das für ein effect? kopiert das a in b?
Genau. Manchmal sieht man auch diese Schreibweise:
Klasse b = a;In diesem Fall sind die beiden äquivalent.
-
cool danke, wieder was dazu gelernt

-
Nachdem ich mich jetzt darum gekümmert habe, konnte ich die Methode von NoobLolo oder so nachvollziehen. Im Gegensatz zur Methode von Nexus, die ich persönlich, für möglich gehalten hatte und selbst auch getestet hatte, meckert der Kompiler/Linker da nicht.
Daher Lob, Preis und Anerkennung für NoobLolos (oder so) Lösung.
-
Der Supercoder schrieb:
Nachdem ich mich jetzt darum gekümmert habe, konnte ich die Methode von NoobLolo oder so nachvollziehen. Im Gegensatz zur Methode von Nexus, die ich persönlich, für möglich gehalten hatte und selbst auch getestet hatte, meckert der Kompiler/Linker da nicht.
Würdest du bitte genauer sagen auf was du dich beziehst, und was der Compiler für einen Fehler ausgibt (Da der Kopierkonstruktor hier relevant ist...).
-
Wieso sollte eine nicht funktionsfähige* Klasse kopiert werden??
Da fehlt mir irgendwie der Zusammenhang.
* Im Sinne des Pflichtenheftes
-
Der Supercoder schrieb:
Im Gegensatz zur Methode von Nexus, die ich persönlich, für möglich gehalten hatte und selbst auch getestet hatte, meckert der Kompiler/Linker da nicht.
Was für eine Methode? Kannst du ein wenig konkreter werden?
Der Supercoder schrieb:
Wieso sollte eine nicht funktionsfähige* Klasse kopiert werden??
Wenn du Instanzen einer Klasse nicht kopieren willst, verbiete Kopierkonstruktor und Zuweisungsoperator. Alles andere ist keine vernünftige Option.