Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向自定义类型的静态指针在初始化后保持为nullptr,并且具有相同类型的静态非null指针_C++_Pointers_Static_Namespaces - Fatal编程技术网

C++ 指向自定义类型的静态指针在初始化后保持为nullptr,并且具有相同类型的静态非null指针

C++ 指向自定义类型的静态指针在初始化后保持为nullptr,并且具有相同类型的静态非null指针,c++,pointers,static,namespaces,C++,Pointers,Static,Namespaces,我有两个名称空间,每个名称空间都有一个指向其中一个名称空间内的类窗口的指针 Graphic.h namespace Graphic { //... class Window; //... void init(); static Window* window; } namespace App{ //... static Graphic::Window* mainWindow = nullptr; //... void

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

Graphic.h

namespace Graphic {

    //...
    class Window;

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

    //...
    static Graphic::Window* mainWindow = nullptr;
    //...
    void init();
    void setupGraphic();
    //...
}
#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;
};
App.h

namespace Graphic {

    //...
    class Window;

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

    //...
    static Graphic::Window* mainWindow = nullptr;
    //...
    void init();
    void setupGraphic();
    //...
}
#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

Window.h

namespace Graphic {

    //...
    class Window;

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

    //...
    static Graphic::Window* mainWindow = nullptr;
    //...
    void init();
    void setupGraphic();
    //...
}
#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
初始化
(静态窗口*)App::mainWindow

App.cpp

#include "Graphic.h"

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

void App::setupGraphic()
{
    Graphic::init();
    App::mainWindow = Graphic::window;
}
#包括“App.h”
#包括
#包括
void应用程序::setupGraphic()
{
Graphic::init();
App::mainWindow=图形::窗口;
}
但是
App::mainWindow
保持为空ptr,即使
Graphic::window
已成功初始化,并且已在
Graphic::init()中使用。没有编译警告/错误,我得到的只是一个异常“App::main window was nullptr”。

在“Graphic.h”中,您有

static Window* window;
此语句包含在将
#包含Graphic.h
的每个翻译单元(.cpp)中。因此,每个单元都有自己的变量
窗口
。然后发生的情况是
Graphic.cpp
分配其自己的
window
,但
main.cpp
发现其自己的变量
window
未更改

您应该做以下几点:

在图.h中,声明
窗口
,但不定义它:

extern Window* window;
并在Graphic.cpp中仅定义一次:

Window* Graphic::window = nullptr;
这样,所有转换单元都将引用相同的全局变量
窗口

您应该对App.h中定义的变量
Graphic::Window*mainWindow
执行相同的操作

extern Graphic::Window* mainWindow; // <-- in App.h

extern图形::Window*mainWindow;//App::mainWindow指针仍保持为空。。。我还注意到,我无法使用“=new Graphic::Window();”初始化它也许是关于
namespace App
class Graphic::Window
如何通信的问题?好吧,我现在还制作了App::mainWindow extern并在App.cpp中定义了它,这就解决了它。非常感谢。我必须更加熟悉static和extern。@这是因为您没有一个不带参数的窗口类构造函数,一旦您定义了另一个构造函数,默认的构造函数就会被删除。