wxDev-C++ Klassen Problem
-
Hey Leute ich bin mir nicht ganz sicher ob das Problem hier richtig gepostet ist, aber bitte weist mich darauf hin, wenn es verschoben werden muss
DankeAlso nun zum eingendlichen Problem:
Ich habe mit wxDev-c++ eine Gui gebaut und möchte nun weitermachen indem ich eine Klasse zwischenschalte die es mir ermöglicht Nachrichten auf die Gui auszugeben.
Da ich bis jetzt nur in Java mit Klassen gearbeitet habe stoße ich hier in C++ auf ein paar Sachen. Wir haben in Java im Konstruktor einfach immer mit this einen Zeiger auf die Gui an die anderen KLassen weitergegeben, das habe ich hier auch versucht umzusetzten, aber selbst nach endlosen Tutorials und Stunden im www habe ich noch keine Lösung gefunden. Ich kann zwar einen Zeiger an Funktionen meiner message-klasse übergeben, jedoch gelingt es mir nicht das in einer Variable festzuhalten.Hier mal der reduzierte Code:
Header der Gui KLasse (Ausschnitt):
class message; //KLasse des Nachrichtenmanagers class Project1Frm : public wxFrame { private: message *mm; //erstellen des Managers public: void set_message(); // Zeigt eine Nachricht auf der Gui }ich habe die übergabe der referenz mal abgekapselt in eine init() funktion, die wird dann in der Projekt1Frm.cpp so aufgerufen:
mm->init(this);Header der message-klasse:
class message { public: // class constructor message(); // class destructor ~message(); void init(Project1Frm *g); private: Project1Frm* gui;//das soll die referenz auf die Gui werden };Die funktion init() in der message.cpp:
void message::init(Project1Frm *g) { g->set_message();//Funktioniert ich kann darauf zugreifen gui=g;//an dieser stelle stürzt das Programm ab }Ich hoffe ihr könnt mir helfen, das bereitet mir schon seit tagen schlaflose Nächte

Danke schon mal.P.S. Ich hab vergessen zu erwähnen das das Programm läuft und keine fehlermeldung gibt nur dass es beim aufruf von gui=g; abstürzt...
-
message *mm; //erstellen des ManagersIch glaube hier geht's schon los. Da erstellst du gar nichts, außer einem Zeiger der auf nix zeigt. Da ich mit den Informationen die du angibst nicht genug über dein Programm erfahre, kann ich aber nicht genau sagen ob dies so gewünscht ist oder nicht. In C++ ist es jedenfalls ein riesiger Unterschied ob du ein Zeiger auf ein Objekt hast oder ein konkretes Objekt.
-
Da hast du recht das müsste dann ja wohlohne den stern sein, dasmit das dann auch eine instanz von message wird, aber da sagt mir der kompiler dann schon:
field `mm' has incomplete typeich glaube das problem, was hier ist besteht darin dass ich ja in der Gui-Klasse eine Variable vom Typ message anlege, die KLasse wird aber erst später deklariert... die kann ich aber vorher nicht deklarieren weil diese ein Feld vom Typ der Gui KLasse hat.
Hmm um das Projekt zu beschreiben:
Ich habe eine Relaiskarte die ich über den Seriellen Port ansteuere dafür habe ich bereits eine KOnsolenanwendung geschrieben um die 8 Ausgänge ansteuern zu können. Jetzt bin ich daran eine Gui dafür zu schreiben, die mit der KLasse kommunizieren soll. Denn ich habe z.b. auch noch 4 Eingänge an der Karte also muss es der IO-Manager Klasse (oben erwähnte aus derm Konsolenprogramm) Möglich sein auf die Gui zugreifen zu können um dort Ausgaben zu erzeugen.
Eine Idee dazu wäre über Returns zu arbeiten indem ich in bestimmten Intervallen eine gib_messages() Funktion aufrufe die einen sagen wir message_buffer zurückgibt. Das finde ich aber nicht sehr elegant, sondern besser wäre es ja wenn ich in der IO-Manager per gui->set_message(string text) einfach eine Ausgabe erzeugen könnte.Ich hoffe das hilft ein bisschen mein Problem zu verstehen.
-
Du kannst nicht in beiden Klassen Variablen des anderen Typs haben, wohl aber Referenzen und Pointer. Wenn du mm als normale Variable deklarieren willst, musst du halt die Definition von manager davor machen.
Also:
class Project1Frm; class message{...}; class Project1Frm{...};Du kannst mm natürlich auch dynamisch initialisieren, wobei ich mich jetzt nicht ganz so intensiv mit deinem Problem beschäftigt habe.
-
Hmm also ich habe noch mal probiert er will beim erstellen der Instanz dringen den Stern der ja eig nen Pointer darstellt haben fehlermeldung wie oben beschrieben incomplete type
und wenn ich eine Klasse vor einer andern nur mit class bsp; definiere dann weiß der kompiler zu dem zeitpunkt ja noch nicht welche funktionen die klasse hat, oder? ich hab das nämlich gestern hinbekommen aber er kannte die funktionen der Gui-Klasse nicht.
schönen abend Rennes
-
Nochmal:
class x1; class x2; class x1 { x2 *bla1; //in der zuerst definierten Klasse kannst du keine Instanzen der anderen anlegen x2 &bla2; public: //... } class x2 { x1 bla1; //so, hier ist die andere Klasse bekannt, du kannst direkt ein Objekt davon anlegen public: //... } //C++-Datei x1::Funktion1(){} x1::Funktion2(){} //... x2::Funktion1(){} x2::Funktion2(){} //...
-
Okay, also ich bin jetzt soweit gekommen, dass ich dem message_manager die gui übergeben kann und er kann sie in einer variable speichern. jetzt habe ich allerdings das problem, dass ich vom message_manager nicht auf die funktionen der gui zugreifen kann, diese sind public, der kompiler zeigt sie mir auch an wenn ich den code schreibe.
ich habe es in diesen beiden formen probiert:gui.message(); gui->message();Aber als Fehler bekomme ich: message has not been declared..
bei der zweiten methode kommt: invalid use of undefined 'struct Wfrm' forward declaration of 'struct Wfrm'noch mal den aktuellen code:
#include "message_manager.h" #include "WApp.h" #include "WFrm.h" IMPLEMENT_APP(WFrmApp) bool WFrmApp::OnInit() { message_manager mm; WFrm* frame = new WFrm(NULL); SetTopWindow(frame); frame->Show(); mm.init(frame); mm.set_message(); return true; } int WFrmApp::OnExit() { return 0; } /////////////////////////////message_manager klasse////////////////// #ifndef MESSAGE_MANAGER_H #define MESSAGE_MANAGER_H class WFrm; /* * No description */ class message_manager { public: // class constructor message_manager(); // class destructor ~message_manager(); void init(WFrm* g); void set_message(); private: WFrm* gui; }; #endif // MESSAGE_MANAGER_H message_manager::message_manager() { } // class destructor message_manager::~message_manager() { // insert your code here } void message_manager::init(WFrm* g) { gui=g; } void message_manager::set_message() { gui.message(); gui->message(); }
-
Mach das Design gescheit. Die beiden class WFrm{} und class message_manager{} kommen in die Header. Diese beiden Header werden dann von den C++-Dateien eingebunden. Das entscheidende ist in deinem Fall, dass du diese Deklaration von class WFrm{} nicht inkludiert hast, bevor du die message_manager()-Funktionen implementierst. Du hast lediglich eine Vorwärtsdeklaration(class WFrm;)