pointer will nich durch mehrere klassen
-
hi
ich weiss, das war immer wieder ein thema dieses forums, und ich hab auch schon nach ner lösung gesucht, aber irgendwie haut das hier nich hin:
ich hab mehrere klassen, jeweils mit einem dialogfeld "bestückt". von dem parentfenster werden dann nacheinander mehrere childfenster (modale) geöffnet. in einem dieser childfenster sind meine gesammten variablen (is praktisch der
"variablenspeicher"; das mach sich dann besser wenn man änderungen vornehmen will) gespeichert. bis jetzt habe ich immer mitm_naechsterdialog.m_naechstevariable=dieseoderjenevariable;
jetz versuch ich das ganze mit pointern: nach der anfangsinitialisierung einer variable hab ich erstmal einen pointer auf diese variable gelegt:
m_schiff.handelsmengeerde[0]=5000; // "m_schiff", weil die variable in einer der childklassen steht int* handelsmengeerde0; // der pointer wird erstellt handelsmengeerde0 = &m_schiff.handelsmengeerde[0]; // der pointer wird zugewiesen UpdateData(false);
nun soll eine variable einer der childfenster auf diesen pointer zugreifen und somit den wert von"handelsmengeerde[0]" annehmen:
m_menge1= *handelsmengeerde0; UpdateData(false);
in der cpp des letzten childfensters sind die "schiff.h" sowie die "neuesspiel.h" (in der werden die anfangsdeklarationen getätigt) includiert, trotzdem kriege ich "'handelsmengeerde0' : nichtdeklarierter Bezeichner" und "Zeigeroperation ungueltig" in der letzten datei (also die, in der auf den pointer zugegriffen werden soll).
-
Hast du Handelsmengeerde0 denn auch in der Schiff.h und Neuesspiel.h oder in der letzten cpp-datei deklariert? So wie du es beschrieben hast, sieht das nich so aus...
Ich mach das immer so, wenn ich dich richtig verstanden habe:
Ich erstelle die Objekte in WinMain, oder sonstwo. Meine Klassen besitzen Funktionen, die so heißen: CKlasse::SaveX(X* pX)
In der Klasse wird dann der Pointer auf die Variable gespeichert, die ich auch in der Klasse brauche. Damit bin ich bis jetzt eigentlich immer ganz gut klargekommen, progge ja auch noch nich so lange.PS: Was proggst dun da fürn Spiel? Schiffe versenken?
Hoffe konnte dir helfen. Gruß Maxi
-
Die Klasse des Childfensters kennt die Variable "handelsmengeerde0" anscheinend nicht. Wenn diese Variable (wie ich annehme) zu einem anderen Fenster gehört, dann musst du dem Child-Fenster erstmal die Adresse des anderen Fenster-Objekts bekannt machen. Über diesen Pointer kannst du anschliessend auf die Variable mit dem ominösen Bezeichner "handelsmengeerde0" (
) zugreifen.
Am besten du übergibst im Konstruktor der Childfenster-Klasse einen Pointer auf das Hauptfenster:ChildFensterTyp ChildFenster(&HauptFenster);
Dann kannst du in der Childfensterklasse auf die Elemente vom Hauptfenster zugreifen:
DeineChildVariable = HauptFenster->Variable;
-
erstmal: thx für die antworten ^^
"handelsmengeerde0" soll keine variable sein, sondern der pointer. kann sein dass ich das nich richtig verstanden habe, aber ich dachte man setzt den pointer ...handelsmengeerde0 = &m_schiff.handelsmengeerde[0]; // der pointer wird zugewiesen
... und der is dann überall im programm verfügbar, d.h. ich kann den wert der variable, auf die der pointer zeigt (also handelsmengeerde[0]), per
m_menge1= *handelsmengeerde0;
abrufen. oder?
PS @ Maxi: soll sowas wie freelancer werden (nur nich mit solch schöner graphik *gg*), man kann so ziemlich alles machen was man will ... handeln, schiffe aufmotzen, pirat spielen, aufträge erfüllen ....
[ Dieser Beitrag wurde am 06.03.2003 um 17:24 Uhr von SirNoname editiert. ]
[ Dieser Beitrag wurde am 06.03.2003 um 17:25 Uhr von SirNoname editiert. ]
-
Schreib mal welchen Anwendungstyp du verwendest.
Bei Dialogen übergebe ich immer einen Zeiger der Mainklasse an den Childdialog.Bei SDI.Frames Hole ich mir einen Zeiger auf MainFrame.
-
ich mach ne ganz normale dialogfeldbasierte .exe .
das mit den "übergeben von main- nach childdialog haben ja Cpp_Junky und <Maxi> auch schon gesagt ... aber wozu das? reicht der eine zeiger (der auf die variable in der übergeordneten klasse zeigt) nich aus? ich hab ja schon die .h`s dieser klassen includiert ...
-
tja ... also ich hab mich eben nochmal belesen und hab was über Referenzen gefunden. hört sich nich schlecht an und soll in manchen fällen auch besser sein als die pointer-geschichte. hab das ganze dann auch ausprobiert indem ich in der klasse, in der alle variablen anfangsinitialisiert werden, eine solche referenz "gebildet" habe. (die natürlich auch einer variable zugeordnet ist) dann jedoch kommt das altbekannte problem: wenn ich diese referenz in einer der späteren klassen verarbeiten will: unbekannter bezeichner.
vielleicht geh ich das ganze ja auch falsch an; ich mein von einer übergeordneten klasse eine variable an eine untergeordnete weiterzugeben is nich schwer; aber ich will ja von der untergeordneten auf variablen der übergeordneten zugreifen. wenn es da noch irgendetwas besseres gibt (abgesehen mal von pointern und referenzen) sagt es miroder: wie kann ich "von unten nach oben" auf variablen zugreifen?!
-
OK ... meine letzten 2 posts waren mehr als überflüssig ... das stand alles schonmal irgendwo da ^^ sorry.
ich hab mir jetzt nen pointer in die obere klasse gelegt:Cschiff * pschiff; // der pointer an sich pschiff -> handelsmengeerde[0]; // ???
jetzt die frage:
was hat in meinem codebeispiel die 2te zeile zu bedeuten? is ja, wenn ich das richtig verstanden habe, ein zeiger auf meine variable (ja, "handelsmengeerde[0]" is eine variable in Cschiff). nun mein problem: wie krieg ich diesen zeiger verwertet? ich will den wert von handelsmengeerde[0] in eine andere variable übergeben. ich hab schon herausgefunden, dass es mitm_irgendwas=pschiff->handelsmengeerde[0];
nicht geht. aber wie dann?
-
m_irgendwas muss den selben typ wie handelsmengeerde haben
EDIT: Sorry, vertippt
[ Dieser Beitrag wurde am 07.03.2003 um 17:13 Uhr von MaSTaH editiert. ]
-
ich arbeite bis jetz eh nur mit int`s und CString`s ...
beide variablen haben int. .
der code den ich gepostet habe steht in der OnCreate meiner childklasse, komischerweise nimmt erCschiff * pschiff; // der pointer an sich m_irgendwas=pschiff->handelsmengeerde[0];
ohne meckern und fehler an (es klappt nur nich ^^), jedoch wenn ich ein UpdateData(false) drunter setze gibt es eine fehlermeldung beim ausführen des programms.
-
Warum rufst du eigentlich UpdateData auf. UpdateData ist dafür zuständig zwischen Control und den damit fest verknüpften Variablen zu kommunizieren ->DoDataExchange... Du brauchst es nicht jedesmal wieder aufzurufen. Was willst du überhaupt genau machen???
-
Nochmals:
Übergib den this denes MainDLG an die anderen Klassen.
Und nun etwas Code:
In allen ChildDLGKLASSEN
// In die Header include "DeinehauptDLGClass.h" CDeinehauptDLGClass *m_pOwner; void SetOwner(CDeinehauptDLGClass * pOwner) { m_pOwner = pOwner; };
In deine CDeinehauptDLGClass
CDeinechild m_deinchild; // Hier Create m_deinchild.SetOwner(this); // Übergabe des this an Childdlg
Zugriff im Child auf den HauptDlg dann
mit
m_pOwner->hierirgeneinefunktionodervariable;
Hoffe du hast es verstanden.