C++ 指向自定义类型的静态指针在初始化后保持为nullptr,并且具有相同类型的静态非null指针
我有两个名称空间,每个名称空间都有一个指向其中一个名称空间内的类窗口的指针 Graphic.hC++ 指向自定义类型的静态指针在初始化后保持为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
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。@这是因为您没有一个不带参数的窗口类构造函数,一旦您定义了另一个构造函数,默认的构造函数就会被删除。