我目前在将SDL_Window指针存储为std :: unique_ptr时遇到问题.
我试过的是:
std::unique_ptr<SDL_Window> window_;
解决方案:
std::unique_ptr<SDL_Window, void(*)(SDL_Window*)> window_;
第一次尝试一直在内存头中抛出错误,说SDL_Window是一个不完整的类型.我知道SDL_Window是一个结构,不能实现
SDL_Window* window_ = new SDL_Window();
因此,使用SDL_CreateWindow(params)完成实例化.
问题是:
>为什么我不能为SDL_Window调用默认构造函数(或任何其他)?
>为什么unique_ptr在这种情况下需要删除器,但不在此处:
renderSystem_ = std::unique_ptr<Renderer::RenderSystem>(new Renderer::RenderSystem());
RenderSystem是一个只有默认构造函数析构函数的类.
是因为unique_ptr可以访问析构函数,析构函数充当删除器而不需要作为模板参数?
提前致谢!
最佳答案 正如编译器所说,SDL_Window类型是不完整的.
SDL库使用C语言中的通用模式:指向不完整类型的指针.
在您创建唯一指针时,SDL_Window类型会向编译器查找如下:
struct SDL_Window;
这是您可以创建不完整类型的一种方法.
除了SDL_Window是一个类型,而不是全局变量或函数之外,编译器不知道任何事情.这也意味着它不能假设它具有的大小,它不能假设它有任何构造函数或析构函数.
至于指向SDL_Window的唯一指针,另一种方法是使用它:
struct SDLWindowDestroyer
{
void operator()(SDL_Window* w) const
{
SDL_DestroyWindow(w);
}
};
std::unique_ptr<SDL_Window, SDLWindowDestroyer> window_;
现在你不需要在window_的构造函数中提供一个函数