Ich kann Klasse nicht Nutzen, error C2146, C4430
-
Wenn ich in der Klasse von einem Dialog folgendes schreibe
#include "ThzMeasurement.h" ... class CTHzMessungDlg : public CDialog { ... public: ThzMeasurement Measurement; }mit ThzMeasurement.j
class ThzMeasurement { ...dann erhalte ich folgende Fehler:
1>z:\cpp\thz\thzmessung\thzmessung\thzmessungdlg.h(55) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'Measurement'
1>z:\cpp\thz\thzmessung\thzmessung\thzmessungdlg.h(55) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>z:\cpp\thz\thzmessung\thzmessung\thzmessungdlg.h(55) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.So als wenn die Klasse 'ThzMeasurement' nicht bekannt wäre, was aber eigentlich nicht sein kann. Wenn ich die Zeile herausnehme kompiliert das Projekt wieder.
Matthias
-
Hast du eventuell in der ThzMeasurement.h den Dialog-Header eingebunden? Solche Fehler deuten meist darauf hin, daß der Preprozessor die Deklarationen in eine andere Reihenfolge gebracht hat als du das erwartest.
-
CStoll schrieb:
Hast du eventuell in der ThzMeasurement.h den Dialog-Header eingebunden? Solche Fehler deuten meist darauf hin, daß der Preprozessor die Deklarationen in eine andere Reihenfolge gebracht hat als du das erwartest.
Nicht direkt, aber ich benötige die Datei die theApp definiert:
#include "THzMessung.h"
in der selbst die Dialoge geladen werden:
#include "THzMessungDlg.h"
Matthias
-
Hallo
Da fehlt ein ; nach dem Ende der Klasse.
chrische
-
chrische5 schrieb:
Hallo
Da fehlt ein ; nach dem Ende der Klasse.
chrische
Nein das ist es nicht, denn ohne die Zeile funktioniert es ja.
Der Hinweis von CStoll, dass ich rekursiv header lade und diese damit in undefinierter Reihenfolge geladen werden ist vermutlich der Grund.
Nachdem ich die Rekursion aufgelöst habe (und dabei einiges umschreiben musste) geht es wieder.Matthias
-
Doch, da fehlt eins. Und genauso am Ende der Klasse ThzMeasurement.
-
dEUs schrieb:
Doch, da fehlt eins. Und genauso am Ende der Klasse ThzMeasurement.
Ich streite mich ungerne um semikolons...
#pragma once // Geräte #include "MicosPosCtrl.h" // Einstellungen #include "MicosSettings.h" struct structSettings { MicosSettings micos; }; class ThzMeasurement { private: public: ThzMeasurement(MicosPosCtrl* newVerschiebetisch, structSettings* newSettings); ~ThzMeasurement(void); private: int m_Status; MicosPosCtrl* Verschiebetisch; structSettings* Settings; public: int GetStatus(){ return m_Status; } void SetStatus(int value) { m_Status = value; } void Start(); void Stop(); void Continue(); void DoMeasurement(); };Matthias
-
Hallo
In deinem Beispiel hat aber trotzdem ein ; gefehlt.

chrische
-
Ich bekomme das Problem noch immer nicht in den Griff:
Ich definiere in THzMessung.h
GPIB_SRSRFLockIn LockInRF; GPIB_SRSLockIn LockInLF; structSettings Settings; MicosPosCtrl* Verschiebetisch; ThzMeasurement* Messung;außerhalb der Klasse. Die Werte Settings, Verschiebetisch, Messung brauche ich sowieso in fast allen Dialogen weshalb sie global Sinn machen.
Dazu lade ich in den Dialogen jedesmal
#include "THzMessung.h"damit diese Werte bekannt sind.
Wenn ich hingegen in der Klasse von ThzMeasurement die THzMessung.h Datei lade dann tritt der oben beschrieben Fehler auf.
Also habe ich das umgeschrieben zu
ThzMeasurement.h
class ThzMeasurement { private: public: ThzMeasurement(MicosPosCtrl* newVerschiebetisch, structSettings & newSettings, GPIB_SRSRFLockIn & newLockInRF); ThzMeasurement(MicosPosCtrl* newVerschiebetisch, structSettings & newSettings, GPIB_SRSLockIn & newLockInLF); ~ThzMeasurement(void); private: int m_Status; GPIB_SRSRFLockIn LockInRF; GPIB_SRSLockIn LockInLF; structSettings Settings; MicosPosCtrl* Verschiebetisch; ...#include "ThzMeasurement.h" ThzMeasurement::ThzMeasurement(MicosPosCtrl* newVerschiebetisch, structSettings & newSettings, GPIB_SRSRFLockIn & newLockInRF) { Verschiebetisch = newVerschiebetisch; Settings = newSettings; LockInRF = newLockInRF; } ThzMeasurement::ThzMeasurement(MicosPosCtrl* newVerschiebetisch, structSettings & newSettings, GPIB_SRSLockIn & newLockInLF) { Verschiebetisch = newVerschiebetisch; Settings = newSettings; LockInLF = newLockInLF; }so dass die THzMessung.h dort nicht mehr geladen werden muss: Das kompiliert auch. Allerdings bekomme ich jetzt diese Fehler beim Linken:
1>DlgMicosConfig.obj : error LNK2005: "class MicosPosCtrl * Verschiebetisch" (?Verschiebetisch@@3PAVMicosPosCtrl@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosConfig.obj : error LNK2005: "class ThzMeasurement * Messung" (?Messung@@3PAVThzMeasurement@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosConfig.obj : error LNK2005: "struct structSettings Settings" (?Settings@@3UstructSettings@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosConfig.obj : error LNK2005: "class GPIB_SRSLockIn LockInLF" (?LockInLF@@3VGPIB_SRSLockIn@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosConfig.obj : error LNK2005: "class GPIB_SRSRFLockIn LockInRF" (?LockInRF@@3VGPIB_SRSRFLockIn@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosMoves.obj : error LNK2005: "class MicosPosCtrl * Verschiebetisch" (?Verschiebetisch@@3PAVMicosPosCtrl@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosMoves.obj : error LNK2005: "class ThzMeasurement * Messung" (?Messung@@3PAVThzMeasurement@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosMoves.obj : error LNK2005: "struct structSettings Settings" (?Settings@@3UstructSettings@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosMoves.obj : error LNK2005: "class GPIB_SRSLockIn LockInLF" (?LockInLF@@3VGPIB_SRSLockIn@@A) ist bereits in DlgLockinConfig.obj definiert.
1>DlgMicosMoves.obj : error LNK2005: "class GPIB_SRSRFLockIn LockInRF" (?LockInRF@@3VGPIB_SRSRFLockIn@@A) ist bereits in DlgLockinConfig.obj definiert.
1>THzMessungDlg.obj : error LNK2005: "class MicosPosCtrl * Verschiebetisch" (?Verschiebetisch@@3PAVMicosPosCtrl@@A) ist bereits in DlgLockinConfig.obj definiert.
1>THzMessungDlg.obj : error LNK2005: "class ThzMeasurement * Messung" (?Messung@@3PAVThzMeasurement@@A) ist bereits in DlgLockinConfig.obj definiert.
1>THzMessungDlg.obj : error LNK2005: "struct structSettings Settings" (?Settings@@3UstructSettings@@A) ist bereits in DlgLockinConfig.obj definiert.
1>THzMessungDlg.obj : error LNK2005: "class GPIB_SRSLockIn LockInLF" (?LockInLF@@3VGPIB_SRSLockIn@@A) ist bereits in DlgLockinConfig.obj definiert.
1>THzMessungDlg.obj : error LNK2005: "class GPIB_SRSRFLockIn LockInRF" (?LockInRF@@3VGPIB_SRSRFLockIn@@A) ist bereits in DlgLockinConfig.obj definiertJetzt bin ich ratlos wie ich weitermachen soll.
Den ganzen Code zur Auswertung in ThzMessung.h packen ? Dann wären Daten, Agorithmen und Oberfläche aber alles in einer Datei, dass will ich ja gerade verhindern.
Matthias