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

标签 c++ pointers static namespaces

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

图形.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* Graphic::window 初始化 static Window* App::mainWindow

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::window 正像这样被初始化

图形.cpp

#include "Graphic.h"

void Graphic::init(){
    window = new Window("Engine");
}

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

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( )。没有编译警告/错误,我得到的只是一个异常“App::mainWindow 是 nullptr。”

最佳答案

在“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

关于c++ - 使用相同类型的静态非空指针初始化后,指向自定义类型的静态指针保持 nullptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41200391/

相关文章:

c - 双指针遍历并在二维数组中找到 5 个最大元素。 C

vue.js - 目标 : 'static' and target: 'server' in Nuxt 2. 14 通用模式之间的真正区别是什么?

php - PHP和C++之间的套接字连接

POSIX 上的 C++ 故障转储

c++ - 正在声明一个变量指令

java - 将非静态列表转换为静态列表

file - 如何在 Yesod 中为静态文件启用 'Access-Control-Allow-Origin' header ?

c++ - 通过提及对象本身返回对象字段

c - 初始化动态分配的数组后出现 malloc() 错误

c - 函数参数和参数中的隐式指针转换