指向自定义类型的静态指针在初始化后使用相同类型的静态非空指针保持 nullptr
static Pointer to Custom Type stays nullptr after initialization with static not-null pointer of same Type
我有两个命名空间,每个命名空间都有一个指向其中一个命名空间内的类窗口的指针。
图形.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
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 私有类型的静态常量成员
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- C++ 模板类型的静态 lambda 成员的构造
- 给定一个C++嵌套的私有结构类型,是否有从文件范围静态函数访问它的策略
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 如何在没有实例的情况下获取非静态方法的类型?
- 值和类型的简洁双向静态 1:1 映射
- 静态自动 constexpr t = { "red" , "black" , "green" } 是什么类型;派生到?
- 非类类型表达式的静态类型与动态类型之间的差异
- 如何创建一个编译时静态类类型,该类型初始化具有特定值的成员容器
- 静态数据类型(结构)的组织
- C++静态结构类型成员初始化
- 为什么constexpr静态成员(类型为class)需要定义
- 基于静态成员类型的模板函数专用化
- 初始化 C++ 中类中的非基元静态数据类型
- 模板类中的静态常量类型
- 为什么我们能够在类定义中定义[static const int],而不能定义其他静态const类型
- 静态断言类型a可以由类型B构造
- 为什么静态类类型函数返回零