Zwei Klassen die sich gegenseitig kennen
-
Ich habe zwei Klassen Person und myLlist. myList verwaltet personen und Personen sollte eine myList haben... für Kinder und so weiter.
Hier der Code:
person.h#ifndef _PERSON_H_ #define _PERSON_H_ #include "mylist.h" #include <string> using std::string; class Person{ public: Person(string name); string getName(); void setName(string name); private: string name; }; #endifperson.cpp
#include "person.h" Person::Person(string name) :name(name){} string Person::getName(){ return name; } void Person::setName(string name){ this->name = name; }mylist.h
#ifndef _MYLIST_H_ #define _MYLIST_H_ #include "person.h" #include <list> using std::list; class myList{ public: myList(); void addPerson(Person* p); void removePerson(Person* p); void print(); private: list<Person*> *personen; }; #endifmylist.cpp
#include "mylist.h" #include <iostream> using std::cout; using std::endl; myList::myList(){ personen = new list<Person*>(); } void myList::addPerson(Person* p){ personen->push_back(p); } void myList::removePerson(Person* p){ personen->remove(p); } void myList::print(){ list<Person*>::iterator itr = personen->begin(); for(; itr != personen->end(); itr++){ cout << (*itr)->getName() << endl; } }main.cpp
#include "person.h" #include "mylist.h" int main(){ Person * p1 = new Person("Fritz"); Person * p2 = new Person("Hans"); myList * list = new myList(); list->addPerson(p1); list->addPerson(p2); list->print(); return 0; }Wenn ich das aber compelieren will erhalte ich volgende fehlermeldung:
g++ main.cpp mylist.cpp person.cpp -o test
mylist.h:11: Fehler: »Person« wurde nicht deklariert
mylist.h:12: Fehler: »Person« wurde nicht deklariert
mylist.h:16: Fehler: »Person« wurde in diesem Gültigkeitsbereich nicht definiertmylist.h:16: Fehler: Templateargument 1 ist ungültig
mylist.h:16: Fehler: Templateargument 2 ist ungültig
main.cpp: In function »int main()«:
main.cpp:10: Fehler: keine passende Funktion für Aufruf von »myList::addPerson(Person*&)«
mylist.h:11: Anmerkung: Kandidaten sind: void myList::addPerson(int*)
main.cpp:11: Fehler: keine passende Funktion für Aufruf von »myList::addPerson(Person*&)«
mylist.h:11: Anmerkung: Kandidaten sind: void myList::addPerson(int*)
mylist.h:11: Fehler: »Person« wurde nicht deklariert
mylist.h:12: Fehler: »Person« wurde nicht deklariert
mylist.h:16: Fehler: »Person« wurde in diesem Gültigkeitsbereich nicht definiertmylist.h:16: Fehler: Templateargument 1 ist ungültig
mylist.h:16: Fehler: Templateargument 2 ist ungültigund das nur wenn ich in person.h das include mylist.h mache... ohne weiteren code hinzuzufügen... geht das in C++ nicht, kann ich mir irgendwie nicht vorstellen.
Aber ich verstehe auch nicht was ich falsch mache.
-
Du kannst zwei Header nicht wechselseitig ineinander einbinden. Das #include führt bloss dazu, daß der Präprozessor dort den Inhalt der Datei einbindet - und dank der Include-Guards steht jetzt die Definition von 'Person' HINTER 'myList'.
Als Lösung kannst du Forward-Deklarationen verwenden (die reichen zumindest dort aus, wo du nur den Namen der Zielklasse kennen mußt).
PS: Hat es einen Grund, daß du die list<Person*> auf dem Heap anlegst?
-
ähm... ok, und wie sieht so eine Forward dekleration aus?
PS: ich leg sie auf dem Heap weil es mir besser gefällt

-
boxi schrieb:
ähm... ok, und wie sieht so eine Forward dekleration aus?
Ganz einfach:
class Person;PS: ich leg sie auf dem Heap weil es mir besser gefällt

Das ist die wohl blödeste Antwort, die du geben könntest *scnr*
Dadurch baust du dir wohl mehr Scherereien ein, als die ganze Sache Wert ist. Das geht los bei Speicherlecks über gegenseitige Beeinflussung bis hin zu potentiellen Zugriffsfehlern.
-
"using" in Header Files ist böse.
-
boxi schrieb:
...ich leg sie auf dem Heap weil es mir besser gefällt

Javaist ?

Übrigens: Versuche im nächsten Schritt mal, ein paar "(const) Referenzen" einzubauen; das macht Vieles einfacher/eindeutiger/sicherer/performanter/ .... .
@All: Bitte nicht mit der K-Kackerei anfangen: Ich weiß, daß Referenzen nicht das Allheimittel sind - aber im konkreten Fall könnten man mit ihnen Einiges verbessern.Gruß,
Simon2.