statische Klassenelement zu initialisieren funktioniert nicht [gelöst]
-
Hiho,
versuche mich grade in c++ reinzuarbeiten. Habe meine erste Klasse "Person" erstellt und würde gerne ein statisches Element "standardPerson" vom Typ Person als Datenspeicher für die Werte des leeren Konstruktors (Person()) benutzen.Also z.B. bei
Person y=Person()sollen dem Objekt y die Werte des statisches Elments "standardPerson" zugewiesen werden.
Ich hab da allerdings so menie Probleme wo und wie ich "standardPerson" initialisiere.Direkt bei der Deklaration (im private-Bereich meiner Klasse Person) gehts nicht.
Von außen überPerson::standardPerson(bla,bla)geht natürlich auch nicht, da "standardPerson" ja private ist.
Über eine statische Funktion, die nur zum Setzen von "standardPerson" gedacht ist, funktionierts auch nicht, da bekomm ich von Visual Studio immer die Fehlermeldung:...Nicht aufgelöstes externes Symbol...1 nicht aufgelöste externe Verweise...
was ich nich ganz nachvollziehen kann.
Hier mal der wichtige Code:
class Person{ int alter; string name; static Person standardPerson; public: Person(int alter, string name); Person(int alter); Person(); ... static void setzeStandard(int alter, string name){ standardPerson.alter=alter; standardPerson.name=name; } }hab sufu benutzt und nichts ordentliches gefunden.
-
Die
static Person standardPersonwird bei dir nur deklariert, aber nirgends definiert. Schreib einfach in der .cpp folgendes:Person Person::standardPerson(25, "Hugo");Du kannst übrigens die Attribute ganz einfach in der Initialisierungsliste des Konstruktors mit den Standardwerten belegen, dazu brauchts eigentlich keine "standardPerson". Schau dir außerdem mal default-Argumente für Funktionen an (geht auch bei Konstruktoren), damit kannst du evtl. die Zahl deiner Konstruktoren reduzieren. Ferner solltest du beachten, dass mit deinen aktuellen Konstruktoren die implizite Umwandlung von ints in Personen möglich ist:
void f(Person p); int main() { Person p1 = 25; //Hä?? f(74); //ruft f(Person) auf => Hä????? }
-
Du musst deine statische Variable irgendwo definieren (das ist der Klasse ist nur eine Deklaration). D.h. du musst in irgendeine .cpp Datei
Person Person::standardPerson;schreiben. Dort kannst du deine Person auch initialisieren:
Person Person::standardPerson(1, "Darkwing");
-
Danke für eure Antworten. Jetzt hats funktioniert.
pumuckl schrieb:
... Ferner solltest du beachten, dass mit deinen aktuellen Konstruktoren die implizite Umwandlung von ints in Personen möglich ist:
void f(Person p); int main() { Person p1 = 25; //Hä?? f(74); //ruft f(Person) auf => Hä????? }Hm, ich verstehe nich ganz, warum meine Konstruktoren so eine Umwandlung möglich machen und wie kann ich sowas verhindern?
edit: Mit default-Werten für Funktionsparameter bin ich vertraut. Ich lese hier grade ein C++ Buch bei dem die Version mit dem statischen Standardobjekt vorgestellt wurde und ich wollts einmal nachprogrammieren, damit ichs mal gesehen hab. Ich find die Art selber nicht sonderlich schön bzw umständlich, da man, wie schon von euch erwähnt, ja im leeren Konstruktor einfach die Elemente mit festen Standardwerten initialisieren kann
-
Weil es einen Konstruktor gibt, er einen
intals Parameter akzeptiert. Unter der Haube wird ausPerson p = 25;Person p = Person( 25 );
-
Okay, gut zu wissen und wie müsste mein Code aussehen damit sowas nicht vorkommt?
-
Den Konstruktor, den man ja mit nur einem Parameter aufrufen kann, einfach
explicitmachen.
-
Coole Sache. Damit sind meine Fragen geklärt.
Danke