C++ MemberObjekten den Zugriff auf Klasse erlauben
-
Hi
Ich habe mich leider etwas in ein Problem verrant, das ich im Internet einfach nicht ausreichend dokumentiert finden kann. Möglicherweise hat damit jemand von euch schon Erfahrungen gemacht? Bitte dringend um Hilfe!
Problemschilderung:
Ich habe eine Klasse namens MainClass, welche 3 Unterobjekte besitzt namens DisplayManager, OutputManager und InputManager! Diese drei Unterklassen erben von einer Klasse Thread und verhalten sich daher wie Threads(werden parallel verarbeitet etc...)Mein Problem allgemein war, dass ich einen Weg finden wollte, wie möglichst unkompliziert diese 3 Threads sowohl miteinander als auch mit der MainClass kommunizieren können(lesen und schreiben)!
Was ich nun als Lösung gefunden habe, ist die Möglichkeit, die Objekte im Defaultkonstruktor der mainClass mit einem THIS-Pointer zu erzeugen, sodass sich die MainClass als Referenz selbst an die Threads weitergibt und dort dann jeweils ein pointer von ihr als member gespeichert wird!
//Zugriffsidee innerhalb eines Threads: MemberPointer->GetVariableAusMainClass(); MemberPointer->MemberObjekt.GetVariableAusAnderemThread();
So!
Nun braucht man dafür laut Internet statt eines Includes bei den Threads scheinbar eine Forward Declaration! Soweit so gut! Funktioniert auch!
ABER:Der Compiler erlaubt mir nicht richtig darauf zuzugreifen, wenn ich mit dem Pointer zb die get oder set-Methode der Mainclass aufrufen möchte!
Erhalte pro Zugrifsversuch folgende CompilerErrors:
- Verwendung eines undefinierten Typs MainClass
- Links von: "->GetSoUndSo" muss sich ein zeiger auf eine Struct/class/union befindenGibts eine einfache Möglichkeit diese Zugriffsprobleme zu lösen? Ich müsste sonst nämlich EXTREM viel Code umschreiben!!! Bitte sagt mir nicht, dass das so nicht funktioniert!
-
Hier noch entsprechender GrundlagenCode von meinem Programm (stark vereinfacht):
Hilft hoffentlich mein Problem besser einschätzen zu können:
//MainClass #include "DisplayManager.h" #include "InputDataManager.h" #include "OutputDataManager.h" #include "GlobalVariables.h" //---------------------------------------------------- // Datenstruktur //---------------------------------------------------- class MainClass { public: MainClass(){ DM = new DisplayManager(this); DM->Login(); ODM = new OutputDataManager(this); IDM = new InputDataManager(this); //Member initialisieren } ~MainClass(){ delete DM; delete ODM; delete IDM; } DisplayManager GetDisplayManager() const {return *DM;} InputDataManager GetINputDataManager() const {return *IDM;} OutputDataManager GetOutputDataManager() const {return *ODM;} private: DisplayManager *DM; OutputDataManager *ODM; InputDataManager *IDM; //MemberVariablen //... };
Und hier noch einen Thread als Beispiel:
class MainClass; #include "Thread.h" #include <cstdlib> #include <conio.h> //---------------------------------------------------- // Input - Controller //---------------------------------------------------- class OutputDataManager: public Thread<OutputDataManager>{ public: OutputDataManager(){ MainPTR = 0; // Member init } OutputDataManager(MainClass * MC){ MainPTR = MC; //Member init } ~OutputDataManager(){} // definieren Funktionen // greife hier zu auf MainClass per Pointer // fürs Threading void Run(){ // Funktionen aufrufen Sleep(300); } private: //Member MainClass *MainPTR; //Member };
-
Ich hoffe ihr könnt euch nun ein gutes Bild von meinem Problem machen! Ich suche eine möglichst effiziente Möglichkeit alle In-und Outputdaten sinnvoll miteinander kommunizieren lassen zu können!
Schonmal Danke im Vorraus an alle!
-
/push
-
-
MFK schrieb:
Wo liegt genau das Problem?
Ist der Code nicht nachvollziehbar? Was verstehst du nicht?
Fehlen Angaben?Ich habe mir sehr große Mühe gegeben, dass man versteht was ich brauche, habe nur den notwendigen Code gepostet, damit mein Problem ersichtlich wird, habe CompilerErrors angegeben usw...Möchtest du das Ding selber mal compilieren?
Hier die Threadklasse von der abgeleitet wird:
#ifndef Thread_h__ #define Thread_h__ #include <process.h> template<class T> class Thread{ public: static void staticRun(void* arg){ (static_cast< T*>(arg))->Run(); _endthread(); }; virtual void Run() =0; virtual void Start(){ _beginthread(staticRun, 0, this); } }; #endif // Thread_h__
Hilft das weiter?
-
Nachtrag: Testtreiber
#include "MainClass.h" using namespace std; //---------------------------------------------------- // Main - Funktion //---------------------------------------------------- int main () { MainClass MC; bool forever = true; MC.GetDisplayManager().Start(); MC.GetINputDataManager().Start(); MC.GetOutputDataManager().Start(); while(forever){ } int wait; cin >> wait; return 0; }
-
Mathias_Koenig schrieb:
Wo liegt genau das Problem?
Na dann zitiere ich mal die Beschreibung dieser Rubrik:
C++ mit .NET? Nennt sich C++/CLI, oder in der früheren Version Managed C++. Programmierung des .NET-Frameworks mit C++, oder Fragen zu den Erweiterungen von C++/CLI mit dem Visual Studio.
C++/CLI dient dem Interfacing von .net Code mit C++. Dazu gibt es hier aber nur wenige Fragen, hauptsächlich posten hier Noobs, die mit C++/CLI Windows Forms programmieren wollen. Deswegen machen die meisten hier einen Bogen um diese Rubrik.
Deine Beiträge haben nicht mal damit zu tun.
-
Mathias_Koenig schrieb:
Wo liegt genau das Problem?
Der Fehler ist nicht reproduzierbar.
Dein gezeigter Code ist weder kompilierbar (weil unvollständig), noch reproduziert er den Fehler, weil du die entscheidenden Stellen weggelassen und durch
// greife hier zu auf MainClass per Pointer
ersetzt hast.
In dem verlinkten Thread steht, wie du vorgehen sollst.
Ich kann nur vermuten: Sind die betreffenden Methoden deiner Threads innerhalb der Klassendefinition definiert? Dann reicht dort eine Forward Declaration von MainClass nicht aus. Teile deine Threadklassen ordentlich in Header und Quellcodedatei auf, dann klappt es.
Im falschen Forum bist du außerdem.
-
Oh mist ich bin im falschen Forum oO
Tut mir Leid Leute das hab ich gar ned bemerkt!
Ich habe tatsächlich die Definition der Methoden direkt im header gemacht derweil noch, weil ich sonst die Übersicht verloren hätte am Anfang denke ich. Ich probiere mal, ob das mit Aufteilung dann funktioniert!
Zugriff sieht zB so aus:
if(MainPTR->GetAdminRights() == true){ MainPTR->SetCurrentTemperature(MainPTR->GetCurrentTemperature() + 1); //CurrentTemperature++ }