c++ für Dummies
-
Ich hatte es mit
Klasse MeineKlasse {
static int Index;
public:
....
}
Allerdings kam im Konstruktor dann "undefined reference...". Vielleicht war ja die Zugriffsart falsch.
Vielen Dank erstma

-
aso stimmt
. Setz vor jedes InstanzZaehler noch ein Klasse:: und dann müsste es passen
-
Das mit dem "undefined reference" liegt daran, dass das
static int InstanzZaehler;in der Klassendefinition nur eine Deklaration und keine Definition ist. Du musst in der cpp-Datei, in der du die ganzen Methoden der Klasse definierst (also mit Funktionskörper) noch irgendwo (d.h. außerhalb einer Funktionsdefinition) ein
int Klasse::InstanzZaehler = 0;einfügen, damit der Instanzzähler definiert (und nicht nur deklariert) ist (dabei wird er auch noch mit 0 initialisiert, was ganz praktisch ist).
Viele Grüße,
Felix
-
Möglicherweise erscheint jetzt zweimal ein ähnlicher Post, obwohl der erste im Nirwana scheint...
static int Index;Sollte, per Handbuch die Variable automatisch auf 0 setzen - theoretisch.
static int Index = 0;Wenn ich die Variable jetzt händisch auf 0 setzte, woher weiss der Kompiler, dass er nicht jede Instanz wieder auf 0 setzt?
-
volkard schrieb:
FreakY<3Cpp schrieb:
Der Supercoder schrieb:
D.h. die alle Instanzen von sich selbst kennt
Ich würde also sowas empfehlen
... static std::vector<Klasse> AllObjects; Klasse() { AllObjects.push_back(*this); } ...Das könnte im Destruktor teuer werden.
Ganz davon zu schweigen das dort nur Kopien abgelegt werden...
-
Fellhuhn schrieb:
volkard schrieb:
FreakY<3Cpp schrieb:
Der Supercoder schrieb:
D.h. die alle Instanzen von sich selbst kennt
Ich würde also sowas empfehlen
... static std::vector<Klasse> AllObjects; Klasse() { AllObjects.push_back(*this); } ...Das könnte im Destruktor teuer werden.
Ganz davon zu schweigen das dort nur Kopien abgelegt werden...
Die, wenn man den Copy-Ctor "richtig" implementiert (nämlich so dass auch dort das neue Objekt "gemerkt" wird), wiederum Kopien von sich im vector ablegen, in deren Konstruktor eine weitere Kopie im vector abgelegt wird, und...
Autsch

-
Falls jemand die Lösung des Problems interessiert, kann er diesem Link folgen:
http://www.willemer.de/informatik/cpp/
classattr.htm
Irgendwie voll gut, so'n Internet :-))
-
Der Supercoder schrieb:
Irgendwie voll gut, so'n Internet :-))
*kiss*
-
Leider ist das doch nicht so, wie ich das gerne hätte.
Nach wie vor hätte ich gerne eine Klasse, die sich selbst zählt und im Idealfall von aussen KEINE Parameter erhält. Null, Zero, niente...
-
#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.