klassenproblem
-
Hallo,
hab ein Problem mit den folgenden Klassen:
#include "SerialWriter.h" class SerialProp { public: SerialWriter *ptr; }; / ***************************** end */ #include "SerialProp.h" class SerialWriter : public CWinThread { public: SerialProp *param; };Fehlermeldung: error C2143: syntax error : missing ';' before '*'
Es muss irgendwie daran liegen, dass die eine Headerdatei die andere Headerdatei aufruft und dann anscheinend noch etwas nicht definiert ist.

Wenn ich eine der beiden Variablen + #include herausnehme, funktioniert das Programm.
Gruß
Bernhard
-
Nutze Vorwärtsdeklarierung deiner Klassen. Gegenseitiges Einbinden von Headern funktioniert nicht so wie du es willst.
Oder überlege dir ein besseres Design: Zirkelschlüsse wie du einen nutzen willst sind in den meisten Fällen ein sehr schlechtes Design.
-
versuch mal anchzuvollziehen was der Compiler (genauer der PRäprozessor) macht, wenn er eines der beiden Header durcharbeitet. Bei einem #include ersetzt der Präprozessor die Direktive stumpf durch den Inhalt der eingebundenen Datei.
Google mal nach Forward Declaration, das ist die Lösung für das Problem

-
vielen Dank für die Antworten - hab es jetzt hinbekommen:
class SerialProp { public: SerialWriter *ptr; };Noch eine allgemeine Frage: zeugt es immer von schlechtem Design, wenn man innerhalb einer Klasse eine Variable einer anderen Klasse etc. benötigt?
In meinem Beispiel hab ich die SerialWriter Class, die Text an einen Com-Port schreibt und eine weitere Class, die Ethernet-Daten entgegennimmt. Ein paar Informationen aus den Ethernet-Daten sollen an den COM-Port übergeben werden. Sowohl der Com-Port als auch der Ethernet-Stream besitzt einen eigenen Thread.
Gibt es bessere Möglichkeiten, als einen Handle vom Com-Port in der Ethernet-Class zu installieren, der zu Beginn übergeben wird?
Gruß
-
bernardo schrieb:
Noch eine allgemeine Frage: zeugt es immer von schlechtem Design, wenn man innerhalb einer Klasse eine Variable einer anderen Klasse etc. benötigt?
Nein, eigentlich nie.

Ein Teil von Objektorientierung besteht ja gerade darin, dass man das Programm in Objekte unterteilt, welche gegenseitig voneinander abhängen und in einer Hierarchie stehen. Viel öfter sieht man z.B. Vererbung, wo eine Aggregation (Membervariablen) viel besser passen würde. Das wäre dann schlechter Stil.
bernardo schrieb:
Gibt es bessere Möglichkeiten, als einen Handle vom Com-Port in der Ethernet-Class zu installieren, der zu Beginn übergeben wird?
Ich denke, das ist okay. Im Bezug auf Exceptionsicherheit könntest du vielleicht Objekte mit Wertsemantik (selbst verwaltende Handles, Smart Pointers, Scope Guards) verwenden, aber wahrscheinlich ist das hier unangebracht.