指向自定义类型的静态指针在初始化后使用相同类型的静态非空指针保持 nullptr

static Pointer to Custom Type stays nullptr after initialization with static not-null pointer of same Type

本文关键字:静态 同类型 空指针 nullptr 类型 自定义 指针 初始化      更新时间:2023-10-16

我有两个命名空间,每个命名空间都有一个指向其中一个命名空间内的类窗口的指针。

图形.h

namespace Graphic {
//...
class Window;
//...
void init();
static Window* window;
}

应用程式

namespace App{
//...
static Graphic::Window* mainWindow = nullptr;
//...
void init();
void setupGraphic();
//...
}

我正在尝试使用static Window* Graphic::window初始化static Window* App::mainWindow

窗口.h

#include "Graphic.h"
#include <SDLSDL.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;
};

图形::窗口正在像这样初始化

图形.cpp

#include "Graphic.h"
void Graphic::init(){
window = new Window("Engine");
}

在此初始化之后,我尝试使用Graphic::window初始化(static Window*)App::mainWindow

应用.cpp

#include "App.h"
#include <GraphicGraphic.h>
#include <GraphicWindow.h>
void App::setupGraphic()
{
Graphic::init();
App::mainWindow = Graphic::window;
}

但是App::mainWindow保持 nullptr,即使Graphic::window已成功初始化并且已经在Graphic::init()中使用过。没有编译警告/错误,我得到的只是一个异常"App::mainWindow was nullptr"。

在"Graphic.h"中,你有

static Window* window;

此语句包含在将#include Graphic.h的每个翻译单元 (.cpp) 中。因此,每个单元都有自己的可变window。接下来发生的事情是Graphic.cpp分配自己的window,但main.cpp发现自己的变量window不变。

您应该执行以下操作:

在 Graphic.h 中,声明window但不定义它:

extern Window* window;

并且只在图形中定义一次.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