c++ - 关于 SDL_Window 和 unique_ptr 的几个问题

标签 c++ sdl 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) 完成的。

问题是:

  1. 为什么我不能为 SDL_Window 调用默认构造函数(或任何其他构造函数)?

  2. 为什么 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_

提供函数

关于c++ - 关于 SDL_Window 和 unique_ptr 的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29424877/

相关文章:

c++ - std::unique_ptr<> 作为基于节点的结构中的指针

c++ - unique_ptr 的 move 构造函数的实现问题

c++ - 找不到-lX11

c++ - 任意类型的映射 vector

c++ - 使用 SDL_FillRect 创建矩形

c++ - 如何使用 SDL 获取 win32 文件浏览器?

c++ - 将函数作为模板类型传递并在 C++ 中扣除其类型

c++ - 建立许多哈希表

SDL mutex可以加锁两次吗?

c++ - 如何将现有对象的地址分配给智能指针?