Informationsaustausch zwischen verschiedenen Klassen
-
Hallo,
ich arbeite gerade daran, in ein existierendes Tower-Defence-Spiel ein Zeit und Resourcensystem einzubauen (Hausarbeit für die Uni). Dabei stoße ich auf ein sehr grundlegendes Problem. Vielleicht reicht ja der richtige Begriff, damit ich etwas googeln kann, das mir weiterhilft.Mein Problem ist, dass ich aus der Klasse Turm auf die Klasse Punkte zugreifen muss.
Skizze:
Welt / \ Turm Punkte / \ / \ shot() E F addPunkte()Welt.Turm.shot() soll Welt.Punkte.addPunkte() aufrufen. Gibt es eine Möglichkeit, dass ohne eine vermittelnde Klasse hinzubekommen?
-
Da Welt sowohl Turm als auch Punkte kennt, würde ich Welt als Mittler benutzen...
Aber für Genaueres hast Du zu wenig Informationen geliefert.
-
Mit der Skizze kann ich nichts anfangen.
kauflummi schrieb:
Mein Problem ist, dass ich aus der Klasse Turm auf die Klasse Punkte zugreifen muss.
punkte.hpp
#ifndef DEINPROJEKT_PUNKTE_HPP_INCLUDED #define DEINPROJEKT_PUNKTE_HPP_INCLUDED class punkte {...}; #endifturm.hpp
#ifndef DEINPROJEKT_TURM_HPP_INCLUDED #define DEINPROJEKT_TURM_HPP_INCLUDED #include "punkte.hpp" class turm {...}; #endif?
edit: Ah, womöglich hast Du fälschlicherweise das Wort "Klasse" statt "Objekt" verwendet.
-
kauflummi schrieb:
Mein Problem ist, dass ich aus der Klasse Turm auf die Klasse Punkte zugreifen muss.
Wieso?
-
Gut Möglich dass ich da Begriffe unsauber verwende. Ich stochere gerade im Nebel nach einem Punkt, von dem aus ich lernen kann, was genau das Problem ist.
Im Gameloop durchläufen die Türme eine Liste der Gegner, sobald ein Gegner in Reichweite ist, wird geschossen. Dieses Ereignis will ich um eine Erhöhung der Punkte erweitern. Ich hatte mir das ganz simpel vorgestellt:
app.world.gamescore.addScore(100);
Allerdings bekomme ich folgende Fehler:
error C2065: 'app': nichtdeklarierter Bezeichner
error C2228: Links von ".world" muss sich eine Klasse/Struktur/Union befinden.
ebenso für gamescore und addScoreHaben die Member keinen Zugriff auf die öffentlichen Member / Funktionen der Objekte, in denen sie enthalten sind?
-
Schonmal Danke für Eure Antworten!
-
kauflummi schrieb:
app.world.gamescore.addScore(100);
...
Haben die Member keinen Zugriff auf die öffentlichen Member / Funktionen der Objekte, in denen sie enthalten sind?Ich versteh nicht was du meinst. Auf als public deklarierte Eigenschaften zuzugreifen (nein, diese überhaupt public zu deklarieren) ist ziemlich gegen OOP-Denkweisen.
Lieber Getter oder so.
Weißt du, ich würde mich echt totlachen wenn du app nicht deklariert hast.
-
Mein Vorschlag: Redesign.
Welt.Turm.shot() soll Welt.Punkte.addPunkte() aufrufen.
So ne Konstruktion kann in gewissen Fällen Sinn machen, bei dir seh ich das aber nicht so.
Gibt verschiedene Ansätze: Punkte global machen (schlechte Idee), Punkte zum singleton machen (im Grunde dasselbe wie global in dem Fall, auch schlechte Idee), Punkte per dependeny injection weitergeben (also Turm bekommt eine Referenz auf Punkte - halt ich aber in dem Fall auch nicht für sinnvoll)
Was ich machen würde:
Prinzipiell interessiert sich ein Turm nicht für Punkte. Das das Schießen eines Turms Punkte gibt, ist das ERGEBNIS davon. Meine Antwort wäre folgendes.
Turm.shot() gibt als Ergebnis die Änderung der Punktzahl zurück.int additionalPoints = turm.shot(); punkte.AddScore(additionalPoints);
-
/*...*/ class See { std::vector<Entchen> allemeineentchen_; std::vector<Gaenschen> allemeinegaenschen_; friend class Entchen; /*...*/ }; class Entchen { std::vector<Kueken> allemeinekueken_; See & meinSee_; attacke(); public: Entchen(See & see) : meinSee_(see){}; /*...*/ }; Entchen::attacke() { meinSee_.allemeinegaenschen_[xyz].federzupfen(/**/); //... } /* Nun mußt Du den Entchen beim konstruieren nur den See mitgeben */Edit: friend
-
kauflummi schrieb:
Haben die Member keinen Zugriff auf die öffentlichen Member / Funktionen der Objekte, in denen sie enthalten sind?
Zugriff, ja. Aber ein Element kennt nur sich und weiß auch nicht von allein, worin es enthalten ist.
Du hast uns leider nicht verraten, wo diese app.world-Zeile steht.
Überhaupt hast Du zu wenig verraten.
Google mal "separation of concerns".
-
kleiner Troll schrieb:
Meine Antwort wäre folgendes.
Turm.shot() gibt als Ergebnis die Änderung der Punktzahl zurück.Halt ich für die unter den gegebenen Umständen momentan beste Idee
