Verschiedene Klasse haben sich gegenseitig als Variable.
-
Ich bekomm das ganze nicht compiliert, vielleicht ist auch meine Planung Mist, hier die Szenerie:
**
Fenster
+Thread
+Berechnung
**Erklärung: Klasse Fenster hat je einen Pointer auf die Klasse Thread und auf die Klasse Berechnung. Grundsätzlich werden die Pointer auch benutzt, also nicht nur weitergereicht (somit reicht class Thread; nicht mehr aus damit der Compiler zufrieden ist).
**
Thread
+Berechnung
****
Berechnung
+Fenster
+Datei
****
Datei
+Fenster
**Jede Klasse hat eine eigene header + include guards und die benötigten Header werden includiert, trotzdem kommt der Compiler damit nicht klar, Beispiel:
In der Klasse Fenster meldet er mir das er Berechnung und Thread nicht kennt, obwohl ich die Header includiert habe. Damit die Klasse Berechnung zufrieden war (sie hat ja ein Fenster als Attribut) hab ich folgendes gemacht:
class Fenster; // Vorwärtsdeklaration #include "Thread.h" #include "Berechnung.h" class Fenster { // [...] // er kennt thread und fenster nicht... };
Und so zieht sichs weiter, bei Klasse Berechnung kennt er Fenster nicht, bei Thread und Datei Berechnung usw. uswf.
Kann man da noch was retten
?
-
was hat berechnung mit fenster zu tun?
-
Im Fenster gibt man den Namen einer Datei an und klickt auf OK. In diesem Moment wird eine Klasse Berechnung angelegt und im Konstruktur der angebene Dateinamen übergeben.
-
Was sagt denn der Compiler? Dein Aufbau scheint mir auch sehr umständlich. Was hast du denn im Groben vor?
-
Ablauf:
- main wird aufgerufen, ein Fensterobjekt angelegt
- Es passiert nichts bis man den OK button drückt (dann wird ein string aus einem Editfeld eingelesen welcher eine Datei angeben soll)
- Die Klasse Berechnung wird angelegt und der string übergeben. Die Klasse Berechnung erstellt im Konstruktur eine Klasse Datei und übergibt den string dort im Konstruktur. Datei kann dinge wie FormatValid() etc.
- Danach wird das Threadobjekt in der Fensterklasse erstellt und der Pointer auf die Klasse Berechnung übergeben
- Der Thread wird gestartet und ruft Methoden der Klasse Berechnung auf
Der Thread deswegen weil sonst bei den Berechnungen die GUI hängen würde.
Ich bin auch gernebereit das Design komplett neu zu machen nur helft mir
-
Verschiebe die die include-Direktiven von den Headerdateien in die .cpp-Dateien.
Setze Vorwärtsdeklarationen der Pointermember-Klassen in die Headerdateien.
-
F11F22 schrieb:
Im Fenster gibt man den Namen einer Datei an und klickt auf OK. In diesem Moment wird eine Klasse Berechnung angelegt und im Konstruktur der angebene Dateinamen übergeben.
lager diese erstellung in eine *cpp aus, dann sollte das Klappen.
-
Und der Fehler vom Compiler?
[Edit]Falls das jetzt noch für dich wichtig ist.[/Edit]
-
Gegenseitiges includieren ist nicht möglich, wenn du keine Forwarddeclaration machst.
Beispiel:
#include "classA.hpp" class classA; // das fehlt jeweils class classB { classA a; };
-
hmm artchi hat die einfachste Lösung gebracht.
Aber irgendwie ist das Design so Mist.
Wie würdet ihr den Aufbau machen? Ich weiß das es als Außenstehender sehr schwer ist sich in die Projekte anderer reinzudenken deshalb will ich es ganz simpel halten:- Es gibt eine Klasse Datei, diese handelt eine datei
- Es gibt eine Klasse Berechnungen, diese greift auf eine Klasse Datei zu
- Beide Klassen wollen dem Benutzer gerne zeigen wie weit sie mit ihrer Arbeit sind, müssen deshalb auf eine Klasse Fenster zugreifen.
- Die Berechnung oder das Fenster muss in einen neuen Thread ausgelagert werden da sonst die GUI hängt.
Wie würdet ihr das realisieren
? Nur den ganz groben Aufbau
- Es gibt eine Klasse Datei, diese handelt eine datei
-
Warum wollen beide Klasse dem Fenster sagen, wie weit sie sind, obwohl nur eine Klasse die eigentliche Berechnung vornimmt?
Ich mach mal rudimentär einen Vorschlag, wo bei die Klasse Datei für mich keinen Sinn macht, aber gut...
class Datei { };
class Berechnung { private: Datei datei; Fenster *fenster; public: void set_fenster(Fenster *f) { fenster = f; } void load_datei(const std::string str) { datei.irgendwas(str); } void calc() { for(int i=0; i < keineAhnung; i++) { // berechnen, irgendwas mit datei machen. // ... fenster->bin_einen_schritt_weiter(); } } };
Fenster hat dann meinetwegen eine Progressbar, die sie dann autom. um eins erhöht, wenn calc() sich beim fenster meldet.
Yo, und starten tust du, dann ein Object von Berechnung, wobei du berechnung noch über eine Methode sagst, welche Datei sie bearbeiten soll.
Berechnung b; b.set_fenster(fenster); b.load_datei("Datei.txt"); b.calc();
Naja, so in etwa...