2016-12-08 5 views
0

나는 이것이 여러 번 묻는 것을 알고 있지만 어떤 해답도이를 해결하지 못합니다.C++ 경비원을 포함하십시오

두 개의 파일이 있습니다.

하여 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에서 변수를 선언 할 메인 함수 내에서 정의하는 것을 시도하고있다. 경비원을 이해할 수 있는지 확실하지 않지만 이상한 오류가 발생합니다.

'irr': 클래스 또는 네임 스페이스 이름이 아닙니다. 구문 오류 : 누락 된 ';' before '*' 누락 된 유형 지정자 - int가 사용됩니다. 참고 : 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에서 사용할 수 있도록 모든 비트으로 Irrlicht의 가볍게 침을 선언 상단에

#include <irrlicht\irrlicht.h> 

을 추가 할 수 있습니다.

그런 다음
extern irr::scene::ISceneManager* sceneManager; 

externsceneManager이 존재하고 저장이 다른 곳에 할당됩니다 컴파일러를 알려줍니다

irr::scene::ISceneManager* sceneManager; 

로 변경합니다. 컴파일러는 미소 짓고 계속 수행하여 하나의 true, 즉 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을 추가하십시오.

그런 다음 헤더에 sceneManagerextern으로 선언해야 해당 헤더를 포함하는 각 컴파일 단위가 자체 변수 인스턴스를 만들지 않아야합니다. 그렇다면 그것은 extern이기 때문에, 당신은 또한 (extern없이) 그것을 main.cpp에 재 선언하고 싶을 것이다.