关于SDL_Window和unique_ptr的几个问题

时间:2015-04-03 01:11:31

标签: 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可以访问析构函数,析构函数充当删除器并且不需要作为模板参数吗?

  3. 提前致谢!

2 个答案:

答案 0 :(得分:2)

正如编译器所说,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_

的构造函数中提供函数

答案 1 :(得分:1)

我找到了这个清洁工:

    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
    );