Globale MFC Variable oO
-
Also folgendes Problem:
Ich habe eine MFC SDI Anwendung mit 3 fach geteilten Fenstern und folglich 3 CView Dateien. Ich habe eine Klassen Instanz die global sein soll und von den 3 CView Instanzen aus ereichbar sein soll, sodass die Instanzen untereinander Daten austauschen können, zB:
CView1: m_Main.m_AuswahlChipSet=10; // m_Main ist die globale Instanz
CView2: int x = m_Main.m_AuswahlChipSet; // x sollte hier dann 10 sein...
Ich habe eine seperate Global.h eingebunden, indem die Instanz definiert oder dekliniert ist und auch #pragma once ausprobiert und diese global.h in allen 3 CView.cpp Dateien eingebunden, doch der Compiler zeigt immer wieder folgende meldung an:
Linking... MapsView.obj : error LNK2005: "class CSystemControll m_Main" (?m_Main@@3VCSystemControll@@A) already defined in ChipSetView.obj MapView.obj : error LNK2005: "class CSystemControll m_Main" (?m_Main@@3VCSystemControll@@A) already defined in ChipSetView.obj Debug/IS RPG Maker.exe : fatal error LNK1169: one or more multiply defined symbols found Error executing link.exe.
**
class CSystemControll** ist die globale Klasse und m_Main die in der global.h deklarierte Instanz...und wenn ich es mit #ifdef _BLUBB_ #define _BLUBB_ [...] #ENDIF ausprobiere, dann erkennt nur eine der 3 CView Instanzen diese "Kommunikations-Klasse" und meldet unbekannter Befehl... -.-
Ich werd noch ganz Kirre im Kopf mit fällt so keine Lösung ein oO
Ich weiß... Global ist böse.. aber ich weiß einfach nicht wie es anders gehen könnte, dass die CView Instanzen untereinander Daten austauschen könnten... Wo und wie muss ich diese globale Instanz der "Kommunikations-Klasse" aufstellen ?
Bitte helft mir (und bitte nicht mit Fachausdrücken steinigen) !
MfG, Iscariot
-
Ich habe bei den Linkermeldungen aufgehört zu lesen, verzeihe also, falls ich was wichtiges übersehen habe
Folgendes:
Deklariere diese Variable als extern. Erstelle eine global.cpp in der du diese externe Variable definierst:
global.h:#pragma once extern CMain m_Main;
global.cpp:
#include "global.h" CMain m_Main;
Ist aber natürlich nicht schön mit globalen Variablen zu arbeiten. Hier würde sich meiner Meinung nach eine Singleton-Klasse (->Google) anbieten.
-
Rein aus besserer Lesbarkeit würde ich aber "g_Main" anstelle von "m_Main" verwenden...
-
Na Super es klappt, jetzt kann meinem Projekt nichts mehr im Weg stehen
Tausend Dank !Adioz, Iscariot
-
Naja es gibt da auch noch die Anwendungsklasse. Du könstet deine "globale" Variable auch in diese als Member einfügen den eine Instanz dieser Klasse ist schon als extern und global definiert.
das teil heißt "theApp"
-
Ahh, perfekt.
genau das problem hatte ich auch. besten dank für die lösung! hat mir sehr geholfen!
-
Hi,
meines Erachtens müsste es auch über die Dok-Klasse gehen, wenn du die Variable dort hast, kannst du von jeder View aus über GetDokument() auf die Dok-Klasse zugreifen. Falls du mit "dreifach geteilt" ein SplitterWnd meinst gehts auf alle Fälle, hab ich auch schon so gemacht.Falls du GetDokument() in der zweiten und dritten View nicht hast... Einfach schauen, wies in der ersten gemacht ist, Code kopieren und Klassennamen etc. anpassen. Vorsicht mit der Inline-Version bei der Release...
Gruß Squeegee
-
Das geht aber nur wenn er nicht für jedes View ein Document hat
-
Ui, ja das stimmt allerdings