Auf Eigenschaft aus anderer Klasse zugreifen, aber wie?
-
Nein ich schnalls nicht - wie soll ich das bitte angehen? lg
-
Du benutzt sie in der Continent.cpp genauso wie in der main.
-
Ja aber ich kann doch keine Variablen benutzen so wie in der main?!
var.getOwner();
-
Doch.
Continent hat Verweise auf Territory, was wiederum Verweise auf Player hat.territories_[x]->GetOwner()->TuWasMitPlayer();
-
Hier mal ein kläglicher Versuch:
Player* Continent::getOwner() const { int element_numbers = territories_.size(); for(int i = 0; i < element_numbers;i++) { if(territories_[i] =! territories_->getOwner()) { return NULL; } } return Player*; }lg
-
tyler.dirden schrieb:
Hier mal ein kläglicher Versuch:
Player* Continent::getOwner() const { int element_numbers = territories_.size(); for(int i = 0; i < element_numbers;i++) { if(territories_[i] =! territories_->getOwner()) { return NULL; } } return Player*; }lg
Was mir gerade aufgefallen ist: Vorsicht in folgender Zeile:
if(territories_[i] =! territories_->getOwner())Es ist "!=" nicht "=!"
-
Ich würde die Funktion in zwei Teilfunktionen splitten.
a) checken ob alle territories den gleichen owner haben und
b) irgendeinen owner zurückgebenbool owned() const { auto first_owner = &territories.front()->owner(); for(auto t : territories) if(&t->owner() != first_owner) return false; return true; } const player& owner() const { return territories.front()->owner(); }Du umschiffst damit das Problem einen Wert für "eigentlich nicht "gepwned"" zu erfinden und für den Anwender ist es eigentlich das gleiche (wenn er nicht vorher
owned()prüft, ist er selber schuld!)continent c; ... if(c.owned()) std::cout << c.name() << " owned by " << c.owner().name() << '\n';PS: wie Du siehst habe ich den Rückgabewert von
owner()zu einer Referenz auf const player gemacht - weil ich ja keinen "nicht gefunden Wert" mehr brauche.
-
if(territories_[i] =! territories_->getOwner())Was ist die Absicht hinter dieser Zeile?

Edit: Ahhhh jetzt habe ich's kapiert.
Dein ungleich Zeichen ist falsch. es müsste != sein (wie jemand anders schon bemerkt hat).
Der Poster über mir hat in diesem Fall recht
-
Ich darf mich erstmal für die vielen tollen Antworten bedanken, und für das "Mit-Kopf-Zerbrechen"

Mit
first_owner = &territories.front()->owner();hole ich mir ja die referenz auf den ersten Eintrag. Wie kann ich mit dieser Methode denn alle durchlaufen ?
lg
-
Edit: Zu wenig gelesen
-
tyler.dirden schrieb:
Mit
first_owner = &territories.front()->owner();hole ich mir ja die referenz auf den ersten Eintrag. Wie kann ich mit dieser Methode denn alle durchlaufen ?
Das ist keine Referenz sondern die Adresse des ersten Eintrags. Was genau Du nachher vergleichst (
playeroderplayer*) kommt auf Deine Implementierung an.Ansonsten: die Methode
owned(), die ich oben skizziert habe macht doch genau das- weis first_owner den ersten owner zu
- für jeden owner o
-
- wenn o != first_owner gib false zurück
- gib true zurück
Dafür benutze ich C++11. Allerdings ist das auch einfach ohne umzusetzen. Eigentlich ist das nur eine klitzekleine Änderung im vergleich zu dem Code, den Du vorgeschlagen hast.
-
Du musst die Klassen wie bei einer Prototyp vorher deklarieren, damit das File weiß worauf es zugreifen kann. Sprich dein Code muss so aussehen.
class Territory;
class Player;class Continent
{
private:
std::string name_;
std::vector<Territory*> territories_;public:
std::string getName() const;
std::vector<Territory*> getTerritories() const;std::void setName(string name);
std::void setTerritories(vector<Territory*> territories);Continent(std::string name, vector<Territory*> territories);
~Continent();Player* getOwner() const;
};