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

时间:2016-12-17 15:56:19

标签: c++ pointers static namespaces

我有两个名称空间,每个名称空间都指向一个名称空间内的类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;

1 个答案:

答案 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