2016-12-08 9 views
0

これは何度も尋ねられたことは知っていますが、これを解決する答えはありません。C++警備員を含む

私は2つのファイルを持っています。

MAIN.CPP

#include <irrlicht\irrlicht.h> 

#include <vector> 
#include <string> 
#include <iostream> 

#include "Scene.h" 
#include "Camera.h" 
#include "Gui.h" 

irr::IrrlichtDevice* device; 
irr::video::IVideoDriver* driver; 

int main() { 
device = irr::createDevice(irr::video::EDT_SOFTWARE, irr::core::dimension2d<irr::u32>(640, 480), 16, false, false, false, 0); 

if (!device) 
    return 1; 

device->setWindowCaption(L"NeoTrap"); 
driver = device->getVideoDriver(); 
sceneManager = device->getSceneManager(); 
GUIEnvironment = device->getGUIEnvironment(); 

//Testing 
Mesh* ground = new Mesh(); 
//Testing 

while (device->run()) { 
    driver->beginScene(true, true, irr::video::SColor(255, 120, 102, 136)); 

    sceneManager->drawAll(); 
    GUIEnvironment->drawAll(); 

    driver->endScene(); 
} 

device->drop(); 
return 0; 
} 

Scene.h

#ifndef _SCENE_HEADER_ 
#define _SCENE_HEADER_ 

irr::scene::ISceneManager* sceneManager; 

struct Mesh { 
public: 
Mesh(); 

private: 
}; 

class Scene { 
public: 
Scene(); 

private: 

}; 

#endif 

私はScene.hで変数を宣言されて行うと、main関数内からそれを定義しようとしています。私は警備員を含めて理解できないのか分かりませんが、奇妙なエラーが発生しています:

'irr':クラスまたは名前空間の名前ではありません 構文エラー: before '*' 型指定子がない - 想定されています。注:C++は、デフォルト-INT

サポートしていませんが、私はMAIN.CPPに戻って次の行を移動したときに

irr::scene::ISceneManager* sceneManager; 

プログラムのコンパイルファイル。私がscene.hで宣言できず、main関数から値を設定できないのでしょうか?

+0

'IRR ::シーン:: ISceneManager'が定義されているファイルでは? – tmpearce

+0

Scene.h、一番上にあります。 – Kurieita

+0

いいえ、そういう意味でポインタ型の変数を宣言しています。 ** type **(クラスまたは構造体)はどこに定義されていますか? – tmpearce

答えて

3

ヘッダーに変数を宣言しないことをお勧めします。ヘッダーを含むすべてのファイルが独自のファイルを作成するので、それはひどく終わりに終わります。sceneManager。リンカーが一緒にプログラムを置くときには、sceneManagerという数多くのものが実際にsceneManagerと等しいと主張していて、嫌な状態になってしまい、コンソール全体にエラーメッセージを吹き込むことがあります。 scene.hで

は、それらがscene.hに利用可能であるようにイルリヒトのすべての小物類を宣言するために上部にまで

#include <irrlicht\irrlicht.h> 

を加えます。

その後

extern irr::scene::ISceneManager* sceneManager; 

extern

irr::scene::ISceneManager* sceneManager; 

を変更sceneManagerが存在し、ストレージがどこかに割り当てられますコンパイラに指示します。コンパイラは微笑みながら続けて、どこにあるかをソートして、真のsceneManagerをリンカに置きます。

最後に、リンカが見つけるsceneManager持つようにストレージを割り当てるためにMAIN.CPPに

irr::scene::ISceneManager* sceneManager; 

を置きます。

Documentation on extern

お奨め読み:When to use extern in C++

+0

とても素敵で非常に速い応答です。あなたに+1をありがとう。 :) – Kurieita

+0

簡潔で説明的です。良い答え、+1。 – frasnian

3

sceneManagerirr::scene::ISceneManager*であると宣言していますが、その変数を宣言するときにはirrという名前空間は存在しません。変数を宣言する前にその名前空間を宣言するヘッダーファイルにincludeを追加します。

その後、sceneManagerをヘッダに含めてexternと宣言し、そのヘッダーを含む各コンパイル単位が変数の独自のインスタンスを作成しないようにする必要があります。それで、それがexternであるので、あなたはmain.cppのそれを(externなしで)再宣伝したいと思うでしょう。

関連する問題