C4430 mit C2146
-
hi leute
ich hänge jetzt die ganze zeit schon an einem problem:
und zwar wird der fehler C4430 zusammen mit C2146 erzeugt ->
error C2146:Syntaxfehler: Fehlendes ';' vor Bezeichner 'm_GameManager'
error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.erzeugt wird das in dieser datei in zeile <CGameManager m_GameManager;>
#ifndef CGateway_h_ #define CGateway_h_ CGateway_h_ //------------------------------------------------------------------------ // Includes //------------------------------------------------------------------------ #include <TriBase.h> #include <d3d9.h> #include <d3dx9.h> #include "GameManager.h" #include "Globals.h" //------------------------------------------------------------------------ // Forward Declarations //------------------------------------------------------------------------ tbResult Render(float); tbResult Move(float); //------------------------------------------------------------------------ class CGateway { public: CGateway(HINSTANCE hInstance); ~CGateway(void); tbResult init(void); tbResult exit(void); tbResult run(void); tbResult load(void); tbResult unload(void); tbResult render(float fTime); tbResult update(float fTime); private: bool m_isInit; HINSTANCE m_hInstance; tbConfig m_Config; CGameManager m_GameManager; }; //------------------------------------------------------------------------ #endif // CGateway_h_ich hänge seit 2 stunden an dem fehler und kann das programm nicht compilen
wenn ihr hier auch nichts seht, sagt welche datei gebraucht wird, die poste ich dann...danke an euch
-
Gibt es in GameManager.h eine Definition von CGameManager?
-
da ist die gesamte klasse deklariert und moment jetzt muss ich überlegen wie ichs richtig sage:
GameManager.h beeinhaltet folgendes:
class CGameManager
{
int methode1();
int methode2();
...int member1;
};
-
Skym0sh0 schrieb:
da ist die gesamte klasse deklariert und moment jetzt muss ich überlegen wie ichs richtig sage:
GameManager.h beeinhaltet folgendes:
class CGameManager
{
int methode1();
int methode2();
...int member1;
};Und das letzte ; ist ganz sicher drin?
-
Lass dir mal den Präprozessor-Output ausgeben und schau, ob DORT auch die Definition von CGameManager drin steckt. (Definition, nicht Deklaration! Deklaration wäre nur eine Zeile "class CGameManager;")
Ggf. ist in dem Header ein include-guard vorhanden, das an anderer Stelle schon definiert wurde -> der Inhalt des Headers würde übersprungen.
-
mh hab mir das angeguckt
und wenn ich das richtig sehe wird die datei ordnungsgemäß eingebunden...
-
kommentier mal bitte die includes der Header, die NICHT von dir stammen aus (ich vermute Tribase.h, d3d9.h, d3dx9.h) und poste hier das, was danach aus dem präprozessor kommt. Alternativ den Inhalt von GameManager.h und Globals.h - wobei ich bei letzterem Angst um meine Zehennägel habe, klingt nach einer Sammlung globaler Variablen...
-
In GameManager.h steht nicht zufällig:
#include "CGateway.h"
-
nein
aber da steht #include "Globals.h" und da wird das gateway includet...
allerdings hab ich auch in globals.h forward declarations für CGameManager und CGateway
-
Skym0sh0 schrieb:
aber da steht #include "Globals.h" und da wird das gateway includet...
Das heißt, Globals.h und CGateway.h binden sich gegenseitig ein?
Kann nicht funktionieren, lös das auf.
-
mh ok hab ich, jetzt klappts auch
aber ich hatte eigentlich in errinerung dass das geht...
naja vllt von java herdanke auf jedenfall
-
in java gibt es keine includes
setzt dich ein wenig mit der materie auseinander, also wie das C++ übersetzungsmodell aussieht, was #include eigentlich macht. dann sollte dir schnell klar werden, dass es nicht gehen *kann*.
-
jaja mir ist schon klar dass include die angegebene datei da einfach einsetzt
aber ich hatte in errinerung hier gelesen zu haben dass gegenseittiges inkludieren funktioniert...
und damit sollte ja auch mein problem weg sein dann
-
Skym0sh0 schrieb:
jaja mir ist schon klar dass include die angegebene datei da einfach einsetzt
aber ich hatte in errinerung hier gelesen zu haben dass gegenseittiges inkludieren funktioniert...
Denk noch mal genau nach, weshalb hier ein Widerspruch vorliegt.
-
natürlich funktioniert gegenseitiges includen.
nur ändert es nichts daran, dass der compiler zuerst ne definition oder fwd. decl. einer klasse sehen muss, bevor man sie irgendwo verwenden kann. und je nach verwendung reicht eine fwd. decl. dann oder eben auch nicht.
und es fällt mir jetzt auch auf die schnelle nur eine "sinnvolle" anwendung ein. nämlich wenn man dinge der übersichtlichkeit halber in mehrere header-files aufsplitten will.
z.b. ein template und dessen definition, oder das basis-template und dazugehörende spezialisierungen.
wenn man dann möchte dass
a) der user jedes dieser files direkt inkludieren darf und
b) trotzdem alle zusammengehörenden files inkludiert werden
dann kann man gegenseitig includen.
dabei stehen die #include dann aber in zumindest einem file am ende.beispiel:
// a.hpp #pragma once template <class T> class foo { ... }; #include "b.hpp" #include "c.hpp" // b.hpp #pragma once #include "a.hpp" template <> class foo<int> { ... }; // c.hpp #pragma once #include "a.hpp" template <> class foo<short> { ... };