Objekte Global



  • Hi,
    Wie deklariere ich ein Objekt meiner ersten Klasse,
    so das ich mit diesem Objekt auf Methoden der ersten Klasse
    innerhalb von Methoden der zweiten oder auch dritten Klasse zugreifen kann??



  • Auf alles was unter "public" steht, können auch alle anderen Klassen zugreifen, ansonsten kannst Du mit dem Schlüsselwort friend arbeiten. Aber was genau willst Du? Gib mal ein Beispiel, denn das hört sich alles recht schwammig an, von wegen "Objekte der ersten, zweiten etc. Klasse "



  • Ich habe 4 Klassen (Spieler, Rohstoff, Airport, Spiel),
    Spieler verfügt über eine Methode bye_Objekt, in der er einen Rohstoff kaufen kann.
    Also muss ich ja auf Variablen und Methoden aus der Klasse Rohstoff zugreifen.
    Habe veruscht die Klassen untereinander verebbar zu machen.

    class Spieler: public Spiel public Rohstoff public Airport{
        public:
              std::string name_spieler;
              int geld;
              int grad1, grad2, grad3;
              int current_obj;
    
              Spieler();
    
              void set_name();
              void buy_Objekt();
              void get_Grad(int);
              void sale_Objekt();
              std::string get_name();
              int get_Geld();
    
    };
    

    leider hat dasnicht funktioniert. BEi vererbten Klassen
    greife ich ja mit

    Spieler::buy_Objekt();
    

    auf die Methode zu.
    Und davor habe ich einfach in jeder Klassen Datei .cpp ein Objekt von jeder Klasse erstellt...führt zum Absturz des Programms.
    Wie gesagt, jetzt bin ich dabei alle KLassen untereinander zu vererben.
    Funktioniert aber nicht so wie ich mir das vorstelle.

    MFG

    joeshrooms



  • Also Deine Vererbung ist recht verwegen...

    Grundsätzlich sollte man nur Objekte, die wirkliche Verwandschaft miteinander haben, in solche Beziehungen setzen. Bei Dir sind das völlig verschiedene Objekte, ohne jeglichen zusammenhang. Trenne die wieder auf. Vielleicht solltest Du Dir auch nochmal ein zwei Kapitel zum Thema Objektorientierung durchlesen, ich glaube hier hast Du einfach noch ein bisschen Nachholbedarf.

    Wenn Du ganz normale getrennt Objekte hast, dann kann ein Spieler auch auf einen Konstruktor von Rohstoff zugreifen, der ist immer public. Du solltest Dem Spieler dann nur eine Struktur gönnen, in welcher er seine Rohstoffe speichern kann. Z.B. ein Array...



  • Nun ja vorher hatte ich alles in einer Datei,
    und nur eine Klasse, da hat alles funktioniert.
    Jetzt habe ich versucht das alles aufzusplitten damit
    ich etwas mehr überblick habe...nun ich schau nochmal.
    Danke jedenfalls

    Joe



  • kann au net wenn funzen, wenn du wirklich alle vererbst...

    class B;
    
    class A : public B
    {};
    class B : public A
    {};
    

    kann ja net gehen...aba warcheinlich hab ichs falsch verstanden?
    naj warum nich ein generic object erstellen?
    ("class Object") und von der alle ableiten ??

    Mfg Shade37337



  • generic object??
    Wie funktioinert das?
    Ich bräuchte ein Objekt mit dem ich auf alle Funktionien in
    allen Klassen oder Strukturen zugreifen kann.



  • Was du brauchst, ist eher eine hat-ein Beziehung. Der Spieler hat einen (oder mehrere) Rohstoff(e) und kann dann über dessen öffentliche Memberfunktionen darauf zugreifen.
    (wobei, ich würde die Rohstoff-Reserven als Member der Spielerklasse implementieren)

    class Gebaeude //Basisklasse für alle Gebäude
    {
    public:
      virtual int cost() = 0;//Kosten für Bau
      virtual int produce() = 0;//Produktion pro Zeiteinheit
    };
    
    class Spieler
    {
      int geld;//verschiedene Rohstoffreserven
      vector<Gebaeude*> stadt;//errichtete Gebäude
    public:
      bool buy_objekt(Gebaeude* ngeb)
      {
        if(ngeb->cost() > geld)
          //nicht genug Geld verfügbar
          return false;
        else
        {
          geld-=ngeb->cost();
          stadt.push_back(ngeb);
          return true;
        }
      }
    
      void produziere()
      {
        for(int i=0;i<stadt.size();++i)
          geld+=stadt[i]->produce();
      }
    
      ...
    };
    


  • joeshrooms schrieb:

    generic object??
    Wie funktioinert das?

    Vergiss das ganz schnell wieder, wir sind hier nicht bei Java.



  • joeshrooms schrieb:

    Ich bräuchte ein Objekt mit dem ich auf alle Funktionien in
    allen Klassen oder Strukturen zugreifen kann.

    Jetzt wäre es interessant zu wissen wie du dein Spiel designt hast. Ich finde das irgendwie unsauber.

    Ich würde jetzt aus dem Bauch heraus folgende Programmstruktur (das obige greift auf das darunterliegende zu (und auch nur auf das)) auf die Beine Stellen:

    ___________________________________________________________________________
    |                                                                           |
    |    Spiel                                                                  |
    |___________________________________________________________________________|
     ____________________________________________________    __________________
    |                                                    |  |
    |    Spieler                                         |  |  spieler 2...
    |____________________________________________________|  |__________________
     ____________   ____________________   ______________    ____________  
    |            | |                    | |              |  |            |
    | Rohstoffe  | | Gebäude            | | Einheiten    |  | Rohstoffe  |  ...
    |____________| |____________________| |______________|  |____________|
     ____  ______   ______  _____  _____   ______  ______ 
    |    ||      | | Air- ||     ||     | | Unit || Unit |
    | Öl || Holz | | port || HQ  || ... | |  1   ||  ... |     ...
    |____||______| |______||_____||_____| |______||______|
    

    Die Klasse Spiel verwaltet jetzt die Spieler und sorgt dafür das diese würfeln oder sonstige Aktionen ausführen. Und die Klasse Spieler verwarltet quasi Ihre Ressourcen, Gebäue und Einheiten von selbst.

    Wobei ich noch dazu sagen muss, das Spieler die Klassen Rohstoffe, Gebäude und Einheiten "inkludiert" und als Membervariablen in sich hat. Die Klassen Öl und Holz (oder auch Airport und HQ) sind Kindklassen und erben ihre Eigenschaften von Rohstoffe (oder Gebäude). Achja, Rohstoffe, Gebäude und Einheiten sind Virtuelle Basisklassen (hab ich das jetzt richtig gesagt?) oder Abstrakte Basisklassen.

    Von "Spiel" aus könntest du zwar direkt auf die Methoden der Klassen Airport, HQ etc zugreifen (z.B. um ein Gebäude zu kaufen) aber es wäre besser wenn du in "Spieler" sowas wie "KaufeGebäude(int Typ)" hättest die sich darum kümmert das richtige Gebäude zu kaufen.

    Hoffentlich konnte ich dir den OOP Gedanken etwas näher bringen (wenn nicht, frag einfach weiter) 😃


Anmelden zum Antworten