ISO C++ forbids declaration of `MapITEMS' with no type

0

Witam, gdy próbóję dodać obiekt klasy MapITEMS do składu innej klasy wyskakuje mi taki błąd: ISO C++ forbids declaration of MapITEMS' with no type expected ;' before '*' token .

Już nie wiem dlaczego tak jest, pousuwałem wszystkie namespace z plików nagłówkowych... i nic (w .cpp zostawiłem). gdy zaś dodaję MapITEMS do składu innej klasy to wywala mi błąd podobny tylko że ISO C++ forbids declaration of `inna klasa' with no type, w pliku nagłówkowym z kolejną klasą gdzie takowa jest zamieszczona.

0

Kod.

0

bez kodu to ciężko wymyślić co źle zrobiłeś, ale strzelam, że powinieneś przed deklaracją tej klasy dać: #include "plikwktorymjestdefnicjaklasyMapITEMS.h"

0

może to dlatego że plik MapITEMS.h ma dołączony LuaScript.h a LuaScript.h ma dołączony Scene.h i potem jak jeszcze dodaje ten plik... eh no nie wiem;;;

MapITEMS.h

#ifndef MapITEMS_H
#define MapITEMS_H
#include <math.h>
#include <irrlicht.h>
#include "GameEngine.h"
#include "Timers.h"
#include "LuaScript.h"
using namespace irr; // pozwoliłem sobie przywrócić namespace'y
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

class MapITEMS
{
public:
MapITEMS(Mapa *mmap)
{
eng=mmap->eng;
map=mmap;
texture=NULL;
tmr=false;
scriptFile[0]=NULL;
mscr=NULL;
}
Engine *eng;
Mapa *map;
scene::ISceneNode * node;
video::ITexture *texture; 
irr::newton::SBodyFromNode sphereData;
irr::newton::IBody* sphere_body;
LuaScript *mscr;
int CreateCube(video::ITexture *t,vector3df pos,vector3df rot=vector3df(0,0,0),vector3df siz=vector3df(1,1,1),bool l=false,bool c=true);
int CreateSphere(video::ITexture *t,vector3df pos,vector3df rot=vector3df(0,0,0),vector3df siz=vector3df(1,1,1),bool l=false,bool c=true);
int AddColision();
int AddPhysx(irr::f32 mass=1,vector3df force=vector3df(0,-2,0),vector3df mforce=vector3df(0,0,0));
int SetScript(LuaScript *ss,char s[],int tr=0,bool timer=false,int del=500,int t=1);
int UpDate();
char scriptFile[1000];
bool tmr;
int stryb;
Timers *scrt;
};


#endif

Scene.h

#ifndef Scene_H
#define Scene_H
#include <math.h>
#include <irrlicht.h>
#include "GameEngine.h"
#include "Gracz.h"
#include "MapITEMS.h"
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;
class mScene
{
public:
mScene(Engine *meng,Mapa *mmap,Gracz *p)
{
eng=meng;
map=mmap;
mp=p;
}
Engine *eng;
Mapa *map;
Gracz *mp;
MapITEMS *items[1000];
};


#endif

LuaScript.h

 
#ifndef LuaS_H
#define LuaS_H
#include <math.h>
#include <irrlicht.h>
#include "GameEngine.h"
#include "Gracz.h"
#include "Timers.h"
#include "Scene.h"
extern "C"
{
	#include <lua.h>
	#include <lauxlib.h>
	#include <lualib.h>
}
using namespace irr;
using namespace core;
using namespace scene;
using namespace video;
using namespace io;
using namespace gui;

class LuaScript
{
public:
LuaScript(Engine *meng,Mapa *mmap,Gracz *p,mScene *m)
{
eng=meng;
map=mmap;
mp=p;
ms=m;
luaState = lua_open();
scriptIL=0;
}
~LuaScript(){lua_close(luaState);}     
Engine *eng;
Mapa *map;
Gracz *mp;
mScene *ms;
lua_State *luaState;
char LastLuaErr[500];
bool WykonajSkrypt(char plik[],int tryb=0);
bool Laduj_wykonaj_skrypt(char plik[]);
char *scripts[500];
char scrnames[500][500];
int scriptIL;
};


#endif
0

przekopiuj dokładnie treść błędu

0

Całość wygląda tak:
\LuaScript.h:8, from MapITEMS.h In file included from LuaScript.h:8, from MapITEMS.h
\MapITEMS.h:7, from main.cpp from MapITEMS.h:7, from main.cpp
\main.cpp from main.cpp
**\Scene.h ISO C++ forbids declaration of MapITEMS' with no type ** **\Scene.h expected ;' before '*' token **
\main.cpp In file included from main.cpp
\MapITEMS.h In constructor MapITEMS::MapITEMS(Mapa*)': \MapITEMS.h [Warning] converting to non-pointer type char' from NULL

0
Software napisał(a):

może to dlatego że plik MapITEMS.h ma dołączony LuaScript.h a LuaScript.h ma dołączony Scene.h i potem jak jeszcze dodaje ten plik... eh no nie wiem;;;

To wygląda dokładnie na ten powód. Scene nie potrzebuje całej definicji klasy MapITEMS, tylko to, że taka klasa istnieje. Dodaj deklaracje class MapITEMS; przed Scene i wywal MapITEMS z include'ów. #include działa bardzo prosto, nie ma żadnego zarządzania modułami, tylko wkleja w tym miejscu pliku źródłowego inny plik który jest w parametrze #include.

0

A da się to jakoś sprytnie naprawić, żeby oba te pliki mogły korzystać z tego nagłówka i klasy?
//Ok, dzięki wielkie podziałało z tym Forward declarations. Zobaczę jak dalej z robotą pójdzie.

0

Eh.. pojawił się teraz kolejny problem, niestety już grubszej maści.. W funkcji MapITEMS::SetScript w momęcie podstawienia samego Enginu z MapITEMS do Timera (scrt->eng=eng;) następuje crash którego przedtem nie było i nie wiem czemu nawet występuje, przez samo dodanie class MapITEMS; do Scene.h występuje ten błąd.

int MapITEMS::SetScript(LuaScript *ss,char s[],int tr,bool timer,int del,int t)
{
mscr=ss;
wsprintf(scriptFile,"%s",s);
tmr=timer;  
scrt->eng=eng; // Crash występuje dokładnie w tej linijce. (ten typu wystąpił problem z aplikacją i zostanie ona zakmnięta.)
scrt->InitTimer(del,t);  
stryb=tr;
}

//mój błąd, dodałem teraz do konstruktora MapITEMS, scrt=new Timers(); i działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1