关于 SDL_Window 和 unique_ptr 的几个问题
Couple of questions about SDL_Window and unique_ptr
我目前在将 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 是一个 class,只有一个默认构造函数、析构函数。
是不是因为 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_
的构造函数中提供函数
我觉得这个更干净:
auto window = std::unique_ptr<SDL_Window, std::function<void(SDL_Window *)>>(
SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, kWindowWidth, kWindowHeight, 0),
SDL_DestroyWindow
);
我目前在将 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 是一个 class,只有一个默认构造函数、析构函数。
是不是因为 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_
我觉得这个更干净:
auto window = std::unique_ptr<SDL_Window, std::function<void(SDL_Window *)>>(
SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, kWindowWidth, kWindowHeight, 0),
SDL_DestroyWindow
);