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ückgeben

    bool 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 ( player oder player* ) 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;

    };


Anmelden zum Antworten