Zugriff auf ein Methode einer anderen Klasse
-
Leider hilft es auch nichts wenn ich diese Präprozessor Direktiven vor die includs stelle.
und in meinem programm habe ich es getrennt *.cpp und *.h nur wäre das schlecht zum posten gewesen.
Ich kann dieses Problem einfach nicht lösen.
Kann jemand ***bitte*** einmal seinen Borland anwerfen. Eine Konsolenanwendung starten, drei weitere Units einfügen. In diese Unit dann meinem Quellcode kopieren und dann zum laufen bringen und dann wieder posten.
Ich denke es wird für einen sehr guten programmierer keine allzu lange Aufgabe sein, oder ?
Um dieses Problem wäre es besten wenn ihr es versucht mit einer Refernz, da ich es schon so begonnen habe zu implementieren.
also mitSchachbrett &brett;
BITTE --- BITTE --- BITTE --- BITTE --- BITTE
-
Leg doch einfach mal ein Schachbrett an.
Schachbrett dasBrett;
und jetzt kannst Du von überall drauf zugreifen, einfach mit dasBrett.meineMethode();
So, und jetzt überfallt mich, weil das eine globale Variable ist.
Aber zunächst bitte bedenkt zwei Sachen:1)Gibt's was globaleres als ein Schachbrett in einem Schachprogramm? Warum also nicht global machen.
- Ein Singleton wäre wohl für den Anfang etwas verwirrend.
-
außerdem wär es cool, wenn man auf mehreren Schachbrettern gleichzeitig spielen könnte -> kein Singleton
gelaoescht
-
Danke
So funkt es !! Ich habe ein globale Instanz in unit1 erueugt.Aber der Linker bringt immer folgende Warnung:
[Linker Warnung] Public symbol '_brett' defined in both module C:\...\UNIT1.OBJ and
C:\...\FIGUR.OBJWas bedeutet diese Warnung ?
Meiner Meinung nach ist es aber keine saubere Lösung eine globale Instanz. Das kann man doch sicher anders lösen ??? (Mein Leher mag globale Sachen nicht)
Könnte das jemand mal anders lösen, bitte!
evtl gerade mit einer Referenz, so dass es funktioniert.
-
Also für den Anfang würd ich das Brett erstmal global lassen... es ist in einem Schachspiel (zumindest in einem einfachen) ja erstmal global. Also warum nicht global modellieren.
Den Linkerfehler kriegst Du, weil Du das Brett in der Header-Datei anlegst. Du mußt es in einer cpp-Datei anlegen. Und in die Headerdatei kommt nur die Deklaration:
extern Schachbrett dasBrett;
und in die Implementierung dann:
Schachbrett dasBrett;Das sollte vorerst mal genügen.
MfG Jester
-
und wenn du globale Variablen umbedingt umgehen willst, dann informier dich über das Singleton Pattern - das bewirkt im großen und ganzen das Gleiche wie eine globale Variable, ist aber eleganter und wird wohl auch deinem Lehrer besser gefallen
Aber eigentlich tut's auch eine globale Variable...
Mfg, smasher1985
-
Das gleiche Problem etwas allgemeiner haben wir hier:
-
Das versteh ich nicht ganz mit der Fehlermeldung. Ich habe die Instanz in einer cpp Datei erzeugt.
Also in meiner Konsolenanwendung (vorerst) habe ich die Inanz in der Unit1.cpp erzeugt.
Das sieht so aus:
#include "schachbrett.h" schachbrett brett; int main(int argc, char* argv[]) { brett.ausgabe(); getch(); return 0; }
Ich mache sie halt jetzt global. Was solls. Widerspricht sich halt mit der Kapselung, aber einmal kann man darüber hin wegschauen.
Aber könnt ihr mir bittet nochmal helfen bei dieser Fehlermeldung.Danke
-
Hallo!
Ich glaube ich habe lösung für Dein Problem. Anstatt Datei mit dem Definition der Klasse Schachbrett zu includieren solltest Du class Schachbrett; angeben!
Damit teilst Du den Compeiler mit daß Du die Klasse benutzen will und daß die irgendwo schon declariert ist. Und dann sollte Deine metode Zugriff() einen Parameter übernehmen, ein Referenz auf Schachbrett Objekt: void Zugriff(Schachbrett& brett){ printf("%c", brett.test())}. Dann kannst Du in main cpp Datei ganz normal die Dateien includieren, Objekte von Schachbrett und Figur erzeugen, und deine Metoden aufrufen! Habe ein großes Respekt von Dir! Ich meine so ein Schachprogramm zu schreiben ist meine ansicht nach unendlich schwere Aufgabe! Will mal gerne ganze Programm sehen!
Grüß Denis.
-
Mir fällt auch noch eine Möglichkeit ein, und zwar folgende ( friends )
class A; // Vorwärts-Deklaration class B { void m(A _a); }; class A { private: int i; public: void init(); friend void B::m(A _a); friend void f(A _a, int i); friend class C; };