Auf Eigenschaft aus anderer Klasse zugreifen, aber wie?



  • Hallo Leute,

    Ich bin noch ein ziemlicher Neuling in C++ aber ich bin topmotiviert. Leider steh ich jetzt aber gerade voll an.

    Also es geht um das Spiel Risiko, welches nachgebaut werden soll. Dafür habe ich erstmal drei Klassen(Player, Territory, Continent). Nun hab ich in Territory eine Eigenschaft die sich owner_ nennt, und vom Typ Player* ist. Wiederum gibt es in Continent einen vector<Territory*>, und dort möchte ich mittels der Methode getOwner() prüfen, ob alle Territories eines Continents dem selben Spieler gehören.

    Nun zu meiner Frage. Wie kann ich von dem file Continent.cpp auf owner_ zugreifen(Territory.h)?

    [code]class Continent
    {
    private: 
      string name_;
      vector<Territory*> territories_;
    
    public: 
      string getName() const;
      vector<Territory*> getTerritories() const;
    
      void setName(string name);
      void setTerritories(vector<Territory*> territories);
    
      Continent(string name, vector<Territory*> territories);
      ~Continent();
    
      Player* getOwner() const;
    
    };
    
    [code]class Player
    {
      private: 
        int color_;
        string name_;
    
      public: 
        int getColor();
        string getName();
    
        void setColor(int color);
        void setName(string name);
    
        Player(int color, string name);
        ~Player();
    
        string ColorID(int color_nr) const;
        string getFullName() const;
    };
    
    [code]class Territory 
    { 
      private:
        string name_;
        char short_name_[2];
        Player* owner_;
        char units_;
        vector<Territory*> neighbours_;
    
      public: 
      string getName();
      string getShortName();
      Player* getOwner();
      char getUnits();
      vector<Territory*> getNeighbours();
    
      void setName(string name);
      void setShortName(string short_name);
      void setOwner(Player* owner);
      void setUnits(char units);
      void setNeighbours(vector<Territory*> neighbours);
    
      Territory(string name, string short_name, Player* owner, char units);
      ~ Territory();
    
      bool isNeighbour(Territory &territory);
      void addNeighbour(Territory* territory);
    
    };
    

    Ich möchte auch gleich mal entschuldigen, dass das alles ein wenig schwindlig ist, aber ich kann ja schlecht die ganzen Files reinstellen.

    Vielen Dank schon mal für eure Hilfe.

    lg



  • Wie kann ich von dem file Continent.cpp auf owner_ zugreifen(Territory.h)?

    #include "Territory.h"
    


  • Die Idee hatte ich auch, aber wenn ich auf Owner zugreifen will, dann schreibt er immer dass ich keine Rechte hätte, naja klar, weil es ja privat ist.

    Also ich wollte so mit

    if(Player* Territory::owner_)...
    

    zugreifen. Oder kann ich die getOwner Methode aus dem Territoryfile irgendwie benutzen?

    lg



  • Oder kann ich die getOwner Methode aus dem Territoryfile irgendwie benutzen?

    Ja! Wozu sollte sie sonst gut sein, wenn sie nicht benutzt werden darf?



  • Ich weiß aber leider nur wie ich die von der Main aus benutze, nicht aber von der Continent.cpp aus?!

    lg



  • Na ja, so gefragt: genau so.

    Der Kontinent hat Territorien. Also gehst Du alle durch und rufst für jedes die getOwner-Methode auf, so wie auch in der Main.



  • 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;

    };


Log in to reply