我正在尝试使用指向window
类的共享指针和指向SDL_Window的unique_ptr
(即window
类的成员变量)。我似乎对window
类中的唯一成员变量有一些内存访问问题,并且就我的指针错误而言有点困惑,据我所知我正在使用smart_pointers
一些背景知识:
我正在尝试制作一个非常简单的游戏引擎。我希望engine
类能够指向所有窗口以发出回调等。我想我会使用shared_ptr
来实现此功能。由于除了window
类之外没有其他人需要直接访问SDL_window
我认为最好将其设为unique_ptr
注意的
除了以下main()
函数之外的所有内容都在dll中(不确定是否会产生影响)
struct SK_API sdl_deleter {
void operator()(SDL_Window* p) const { SDL_DestroyWindow(p); }
void operator()(SDL_Renderer* p) const { SDL_DestroyRenderer(p); }
void operator()(SDL_Texture* p) const { SDL_DestroyTexture(p); }
void operator()(SDL_Surface* p) const { SDL_FreeSurface(p); }
};
int main(int argc, char** argv)
{
sky::g_Engine.startup();
std::shared_ptr<sky::Window> window;
window->createWindow("Hello World!", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 200, 200, SDL_WINDOW_ALLOW_HIGHDPI);
sky::g_Engine.engineLoop();
sky::g_Engine.shutdown();
return EXIT_SUCCESS;
}
namespace sky {
class Engine;
class SK_API Window {
friend class Engine;
public:
void createWindow(const char* title, int x, int y, int width, int height, uint32_t flags);
protected:
std::unique_ptr<SDL_Window, sdl_deleter> m_window = nullptr;
};
}
namespace sky {
void Window::createWindow(const char* title, int x, int y, int width, int height, uint32_t flags)
{
m_window = std::unique_ptr<SDL_Window, sdl_deleter>(SDL_CreateWindow(title, x, y, width, height, flags), sdl_deleter());
if (nullptr == m_window) {
std::cout << "window create error" << SDL_GetError() << std::endl;
}
}
}
class SK_API Engine : public Singleton<Engine> {
friend class Singleton<Engine>;
friend class Window;
public:
void startup();
void shutdown();
void engineLoop();
void registerWindow(std::shared_ptr<Window> window);
private:
std::vector<std::shared_ptr<Window>> m_windows;
bool m_isRunning = false;
};