Ich hab eine paar Probleme mit Klassen:
Ich habe folgende Dateien in meinem Projekt:
main.cpp - Mainfunktion
global.h - Beinhaltet includes und globale Objektklassen
MyEventReceiver.h und .cpp - Beinhaltet die Klasse MyEventReceiver
functions.h und .cpp - Beinhaltet einige Funktionen
Nun zu den Problemen:
Ich möchte folgende Objekte in global.h haben:
Code:
IrrlichtDevice* device;
IVideoDriver* driver;
ISceneManager* smgr;
IGUIEnvironment* guienv;
rvn::MyEventReceiver rv;
Schreibe ich das so in global.h Bekomme ich vom Visual Studio Compiler folgende Fehler:
Zitat:
1>e:\c++\irrlicht\tut\web\web\global.h(25) : error C2653: 'rvn': Keine Klasse oder Namespace
1>e:\c++\irrlicht\tut\web\web\global.h(25) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'rv'
1>e:\c++\irrlicht\tut\web\web\global.h(25) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
1>e:\c++\irrlicht\tut\web\web\global.h(25) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
Er findet also weder mein namespace rvn, in dem sich die Klasse MyEventReceiver befindet, noch die Klasse selbst, wenn ich das namespace weglasse (MyEventReceiver.h selbstverständlich included).
Deklariere ich dieses Objekt jedoch in main.cpp funktioniert es.
Wie kann ich das lösen, damit rv global ist?
Dann bekomme ich diese Fehler:
Zitat:
1>main.obj : error LNK2005: "class irr::video::IVideoDriver * driver" (?driver@@3PAVIVideoDriver@video@irr@@A) ist bereits in functions.obj definiert.
1>main.obj : error LNK2005: "class irr::scene::ISceneManager * smgr" (?smgr@@3PAVISceneManager@scene@irr@@A) ist bereits in functions.obj definiert.
1>main.obj : error LNK2005: "class irr::gui::IGUIEnvironment * guienv" (?guienv@@3PAVIGUIEnvironment@gui@irr@@A) ist bereits in functions.obj definiert.
1>main.obj : error LNK2005: "class irr::IrrlichtDevice * device" (?device@@3PAVIrrlichtDevice@irr@@A) ist bereits in functions.obj definiert.
1>MyEventReceiver.obj : error LNK2005: "class irr::video::IVideoDriver * driver" (?driver@@3PAVIVideoDriver@video@irr@@A) ist bereits in functions.obj definiert.
1>MyEventReceiver.obj : error LNK2005: "class irr::scene::ISceneManager * smgr" (?smgr@@3PAVISceneManager@scene@irr@@A) ist bereits in functions.obj definiert.
1>MyEventReceiver.obj : error LNK2005: "class irr::gui::IGUIEnvironment * guienv" (?guienv@@3PAVIGUIEnvironment@gui@irr@@A) ist bereits in functions.obj definiert.
1>MyEventReceiver.obj : error LNK2005: "class irr::IrrlichtDevice * device" (?device@@3PAVIrrlichtDevice@irr@@A) ist bereits in functions.obj definiert.
1>E:\C++\Irrlicht\tut\web\Debug\web.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
Was das mit functions zu tun hat weiß ich nicht, da dort keine der Klassen vorkommt.
functions.h:
Code:
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
#include "global.h"
using namespace std;
using namespace irr;
using namespace core;
using namespace video;
using namespace scene;
using namespace gui;
bool collision(ISceneNode* one, ISceneNode* two);
void line(int length=80,char character='-');
#endif
functions.cpp:
Code:
#include "functions.h"
bool collision(ISceneNode* one, ISceneNode* two)
{
return one->getTransformedBoundingBox().intersectsWithBox(two->getTransformedBoundingBox());
}
void line(int length,char character)
{
for(int i=0;i<length;++i)
cout<<character;
if(length!=80)
cout<<endl;
}
Dieses Problem lässt sich mit einem static vor den Objektdeklarationen lösen, ich verstehe aber nicht wieso.
Sorry für den langen Text
