GeneralB Geschrieben 23. April 2010 Geschrieben 23. April 2010 Hallo zusammen Aus einem für mich unerfindlichen Grund kann ich aus meiner Klasse Person keine Methoden der davon erbenden Klasse Trader aufrufen. class Person // Person ################################################################################## { //friend class Item; //friend class Ort; friend class Trader; private: int health; int maxhealth; int action; int maxaction; int attack; int defence; string name; string ort; int level; int experience; int money; string item; string say; string waffe; static int objectNumber; public: ... void lookAround(vector<Ort*> *arrOrt, vector<Person*> *arrPerson, vector<Trader*> *arrTrader, vector<Item*> *arrItem, Person *player) { ... cout << "Haendler: \n"; for (size_t i=0; i<arrTrader->size(); i++) { if (arrTrader->at(i)->getOrt() == ort) { cout << " " << arrTrader->at(i)->getName() << "\n"; check = 1; } } if (check == 0) { cout << " Niemand hier...\n"; } ... class Trader : public Person { friend class Person; private: vector<string> ware; vector<int> preis; public: Trader(vector<string> war, vector<int> prei, string na, string o, string s) : Person(na, o, s) { ware = war; preis = prei; name = na; ort = o; say = s; } ... [/PHP] Als Fehler wird mir angezeigt: In der Zeile: [i]if (arrTrader->at(i)->getOrt() == ort)[/i] invalid use of undefined typ 'struct' Trader In der Zeile: [i]friend class Trader;[/i] forward declaration of 'struct' Trader In der Zeile: [i]cout << " " << arrTrader->at(i)->getName() << "\n";[/i] nochmal invalid use of undefined typ 'struct' Trader und die Fehlermeldung der friedclass-Zeile woran liegt das? Ich kann Objekte anderer Klassen ohne Probleme in der Methode anzeigen lassen.. Zitieren
carstenj Geschrieben 23. April 2010 Geschrieben 23. April 2010 Hi, mmh....irgendwie kann das nicht gehen, denn bevor ein Trader erzeugt wird, muss ja erst eine Person erzeugt werden. Das geht aber nicht, wenn die Klasse Person einen Trader benötigt. Du müsstest eine Vorwärtsdeklaration außerhalb der Klassendefinition machen. Sowas riecht aber meistens nach einem Designfehler. Zitieren
GeneralB Geschrieben 23. April 2010 Autor Geschrieben 23. April 2010 (bearbeitet) Trader und Personen werden aus .ini's erzeugt. Und zwar erst Trader, dann Personen. Sollte doch so stimmen, oder? Bearbeitet 23. April 2010 von GeneralB Zitieren
carstenj Geschrieben 23. April 2010 Geschrieben 23. April 2010 Hi, also von der Logik her: Wie soll denn ein Trader erzeugt werden, wenn als Basisklasse eine Person benötigt wird, die wiederum einen Trader benötigt? Ich muss zugeben, dass ich in C++ nicht mehr ganz drin bin, meines Verständnisses nach geht das nicht. Selbst wenn das irgendwie kompiliert werden könnte, stellt sich immer noch die Designfrage. Ich würde vermutlich eher eine gemeinsame Basisklasse nehmen. Zitieren
Klotzkopp Geschrieben 23. April 2010 Geschrieben 23. April 2010 Implementiere die Methoden nicht innerhalb der Klassendefinition, sondern trenne das sauber in .h (Klassendefinitoin) und .cpp (Methodendefinitionen) auf. Dass eine Klasse ein Freund ihrer eigenen Basisklasse ist, halte ich übrigens für einen Designfehler. Dafür gibt es private, protected und public. Zitieren
Guybrush Threepwood Geschrieben 23. April 2010 Geschrieben 23. April 2010 Aus einem für mich unerfindlichen Grund kann ich aus meiner Klasse Person keine Methoden der davon erbenden Klasse Trader aufrufen. Wie kommst du auf die Idee das das gehen sollte? Die Parent Klasse weiß logischerweiße nichts von irgendwelchen Klassen die von ihr erben. Zitieren
Shamharoth Geschrieben 14. Mai 2010 Geschrieben 14. Mai 2010 funktionieren sollte es, wenn du eine virtuelle (?) Methode in der Elternklasse schreibst und diese dann in der Kindklasse überschreibst. So würde ich es wenn dann machen. Da ich seit längerem nicht mehr so intensiv mit Vererbung gearbeitet habe muss ich sagen: Alles ohne Gewehr (*Peng*)! edit: ghaa nich gesehen, dass das Thema schon a Monat alt is >_<' Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.