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;
    };
    
    #endif
    

    person.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;
    };
    
    #endif
    

    mylist.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ültig

    und 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.


Anmelden zum Antworten