Forum
Tipps
News
Menu-Icon

C++ auf andere klassen zugreifen

Hallo ich hab mal einen neuen Thread aufgemacht weil der alte eigentlich eigentlich schon beantwortet war, ich aber immer noch das Problem habe und ich mir gedacht habe, dass ein neuer Thread besser passt...

Ok, hier meine Frage:
Wie kann/soll ich in C++ denn jetzt genau auf andere Klassen(funktionen/variablen) zugreifen und zwar möglichst sauber.

Hier meine Situation:

Ich habe
- eine Main.cpp (wo main Funktion und Window Messages, etc steht)
- eine Header.h (wo ich sämtliche Klassen beschrieben habe (ich weiß, sollte eigentlich für jede Klasse eine aber ich habe es besser so) und alle nötigen Windows Header etc included habe
- für jede Klasse eine .cpp wo ich die einzelnen Funktionen für die Klassen drinnen habe

Was die Klassen voneinander brauchen:
- 4 Klassen (textures, ship, gstuff, level)
- textures braucht nichts von den anderen Klassen
- ship braucht eine Funktion von textures
- gstuff braucht eine Funktion von level (Klasse gstuff wird aber vor Klasse level definiert, dh gstuff weiß nicht, dass es level gibt)
- level braucht Funktionen von textures, ship und gstuff
- main braucht Funktionen von allen Klassen

So ich hoffe ich habe es eingermaßen klar dargelegt, was sollte ich jetzt wo reinschreiben damit ich auf die Klassen zugreifen kann? (ich habe vor allem das Problem mit gstuff und level, die müssen beide auf den jeweils anderen zugreifen können)


Antworten zu C++ auf andere klassen zugreifen:

Du hast prinzipiell die möglichkeit deine Klassen voneinander erben zu lassen oder friends zu deklarieren.
Aber nun beschreib dein Anliegen mal wirklich konkret - ich glaub du solltest dir einfach nochmal ein Buch mit dem Titel C++/OOP in die Hand nehmen und lernen was du da benutzen willst. Ich kann aus jeder xBeliebigen Klasse auf die Funktion einer anderen Klasse zugreifen wenn ich eine Instanz erzeuge. Versuche ich auf eine ganz bestimmte Instanz zuzugreifen kann ich einen Pointer übergeben, aber ich wüsste nicht wo die Notwendigkeit dafür besteht, das sollte auch die Main können und entsprechend Daten weiter/zurück geben. Klingt für mich einfach immer noch nach failure by design. 

Aufrufen kannst du von außen alles was public ist. 

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

das ist mir schon klar, dass man in klassen funktionen/variablen, private/public und sonstwas machen kann und ich weiß auch was das bringt.

Zitat
Ich kann aus jeder xBeliebigen Klasse auf die Funktion einer anderen Klasse zugreifen wenn ich eine Instanz erzeuge
kann ich eben nicht. ich habe ja oben mein problem geschildert, das ich mit level und gstuff habe - beide klassen müssen aufeinander zugreifen können.
das problem ist, dass ich nicht beide klassen gleichzeitig deklarieren kann, dh eine kommt vorher und die andere nachher und die vorherige weiß nicht, dass die nachherige existiert, also kann sie nichts mit der instanz anfangen...
Zitat
Aufrufen kannst du von außen alles was public ist.
kann ich auch nicht, es sei denn ich habe vorhere eine instanz der klasse gemacht

ich denke ich habe eher ein verständnisproblem mit den instanzen, ich meine eine normale instanz mache ich ja so, oder?:eineKlasse kl;und dann kann ich so auf eine funktion dieser klasse zugreifen: kl.eineFunktion();aber was ist, wenn ich das mit der instanz als zeiger mache?: eineKlasse* kl;
//woanders der aufruf der Funktion
kl->eineFunktion();
das funktioniert ja auch, nur was ist da anders, außer dass es ein zeiger ist?

und dann noch die frage: wenn ich eine instanz einer funktion innerhalb einer anderen mache, sollte die dann dort in private oder public stehen? ich hätte ja gemeint private...

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button

Eine Möglichkeit wären noch statische Funktionen. Um die auszuführen, brauchst du keine Instanz der Klasse. Dafür kannst du innerhalb der Funktion nicht auf nicht-statische Variablen und Funktionen zugreifen.


class MyClass {
public:
    static void doSomething();
}

Darauf kannst du dann zugreifen:

// normal über eine Instanz
MyClass inst;
inst.doSomething();

// statisch ohne Instanz
MyClass::doSomething();
das ist mir schon klar, dass man in klassen funktionen/variablen, private/public und sonstwas machen kann und ich weiß auch was das bringt.

Ich erklär nochmal eben worauf ich hinaus wollte. Du solltest dich mal mit dem Design Objektorientierter Strukturen bzw. Programme befassen.
Die Theorie der OOP/Datenkapselung hört nicht damit auf, dass du weisst, was die Worte public oder private bedeuten.
Zum Design gehört auch, dass du dir Gedanken darüber machst, wer wann warum auf welches Element zugreifen muss - und ob das an dieser Stelle Sinn macht. Dein "im Kreis rum zugreifen" Klingt einfach nach failure by design - das eben das Design schrott ist und du nicht an den Grenzen der Sprache scheiterst - bzw. das du auf Teufel komm raus etwas bewerkstelligen willst, was einfach nicht so gedacht ist.
So kann ich mir bspw Vorstellen, dass eine Klasse Level zugriff auf bestimmte Elemente einer Klasse Schiff braucht - warum das aber umgekehrt der Fall sein sollte will mir um's verrecken nicht in den Kopf, sämtliche Möglichkeiten die mir einfallen sagen mir "Hier hat jemand ganz groben Mist geplant".
Und selbst bei Dingen die sich eigentlich fremd sind und gegenseitiger Zugriff nötig sein könnte seh ich immer eine Klasse "Verwalter" vor mir, die als Schnittstelle die Kommunikation zwischen 2 Artfremden Klassen herstellt, ohne ihnen gegenseitig zu erlauben aufeinander zuzugreifen.
Dazu saubere Get/Set Methoden und ich erhalte auf alles Zugriff was ich will/brauch.

Das ist der Punkt auf den ich hinaus wollte - und das ist auch einer der Punkte der in jedem noch so billigen Fachbuch entsprechend beschrieben ist unter "wie plane ich eine Anwendung die mehr als Hello World kann".

Mach dir lieber nochmal gründlich Gedanken ob der Weg den du gehen willst wirklich nötig ist, bevor du dein Projekt in ner halben Woche wieder einstampfen kannst.

Gruß Dave

Hat dir diese Antwort geholfen?

Danke ButtonHilfreiche Antwort Button
Zitat
Zum Design gehört auch, dass du dir Gedanken darüber machst, wer wann warum auf welches Element zugreifen muss - und ob das an dieser Stelle Sinn macht.
das war mir im prinzip auch klar, ich habe zumindest versucht alle klassen gut einzuteilen in die einzelnen bereiche und dort die benötigten funktionen/variablen einbaue. trotzdem bin ich dann im endeffekt auf dieses problem gestoßen, da ich diese konzept eben genau einhalten wollte.

worum genau es sich bei diesem problem handelt möchte ich jetzt nicht erklären, da dies hier zu weit führen würde und ich derzeit nicht die nötige zeit dafür habe...

wie auch immer, inzwischen habe ich mein problem auch schon gelöst, das "2 klassen aufeinander zugreifen" prinzip habe ich jetzt gelassen und mir eine andere lösung überlegt. trotzdem danke für eure hilfe ;)
« Letzte Änderung: 20.09.10, 17:58:17 von Triver »

« Tastendruck für BluescreenExcel VBA: Zeilen nach Datum in erster Spalte sortieren. »
 

Schnelle Hilfe: Hier nach ähnlichen Fragen und passenden Tipps suchen!

Fremdwörter? Erklärungen im Lexikon!
C++
C++ ist eine von der ISO standardisierte Programmiersprache und eine erweiterte Form von C zur objektorientierten, generischen und prozeduralen Programmierung. Weitestgeh...

Windows
Windows ist der Markenname des Betriebssystems von Microsoft, das sich von einer grafischen Erweiterung von MS-DOS zu dem am weitesten verbreiteten Betriebssystem welt...

Windows Mobile
Windows Mobile ist die Version von Microsofts Betriebssystem Windows für mobile Endgeräte wie Smartphones und Tablets. Sie wurde aber mittlerweile abgelöst...