我有两个名称空间,每个名称空间都指向一个名称空间内的类Window。
Graphic.h
namespace Graphic {
//...
class Window;
//...
void init();
static Window* window;
}
App.h
namespace App{
//...
static Graphic::Window* mainWindow = nullptr;
//...
void init();
void setupGraphic();
//...
}
我正在尝试使用static Window* App::mainWindow
static Window* Graphic::window
window.h中
#include "Graphic.h"
#include <SDL\SDL.h>
class Graphic::Window
{
public:
Window(const char* pName = "OpenGL Window",
unsigned int pWidth = 1000, unsigned int pHeight = 700);
~Window();
const char* name;
unsigned int width;
unsigned int height;
SDL_Window* window;
};
正在初始化Graphic ::窗口
Graphic.cpp
#include "Graphic.h"
void Graphic::init(){
window = new Window("Engine");
}
在初始化之后,我尝试使用(static Window*)App::mainWindow
Graphic::window
App.cpp
#include "App.h"
#include <Graphic\Graphic.h>
#include <Graphic\Window.h>
void App::setupGraphic()
{
Graphic::init();
App::mainWindow = Graphic::window;
}
但App::mainWindow
仍保留nullptr,即使Graphic::window
已成功初始化并已在Graphic::init()
中使用过。没有编译警告/错误,我得到的只是一个例外&#34; App :: mainWindow是nullptr。&#34;
答案 0 :(得分:3)
在“Graphic.h”中,你有
static Window* window;
此声明包含在#include Graphic.h
的每个翻译单元(.cpp)中。因此,每个单元都有自己的变量window
。然后会发生Graphic.cpp
分配自己的window
,但main.cpp
找到自己的变量window
不变。
您应该做的是以下内容:
在Graphic.h中,声明window
但不定义它:
extern Window* window;
在Graphic.cpp中只定义一次:
Window* Graphic::window = nullptr;
这样,所有翻译单元都将引用相同的全局变量window
。
您应该对App.h中定义的变量Graphic::Window* mainWindow
执行相同的操作。
extern Graphic::Window* mainWindow; // <-- in App.h
和
Graphic::Window* App::mainWindow = nullptr; // <-- in App.cpp