将unique_ptr与GLFWwindow一起使用

时间:2016-03-04 10:28:39

标签: c++ opengl glfw

我正在使用GLFW来处理应用程序中的窗口事件。它工作正常。后来我决定从GLFWwindow开始删除原始指针。它在文件glfw3.h中定义为:

3

我无法在头文件中找到结构的实际定义。所以我认为这是一种前瞻性声明,但我不知道为什么它不像

typedef struct GLFWwindow GLFWwindow; 

我尝试使用后一种形式的前向声明来替换前一种形式。它汇编得很好。前者形成前瞻性宣言的亲是什么?

所以真正的问题,由于结构GLFWwindow只是一个声明,唯一指针无法完成模板专业化而无需定义。我不能使用unique_ptr来声明任何指针。编译器给我错误

struct GLWwindow;

任何人都知道如何使用GLFWwindow的唯一指针?

由于

3 个答案:

答案 0 :(得分:7)

您需要将Deleter提供给唯一的ptr:

struct DestroyglfwWin{

    void operator()(GLFWwindow* ptr){
         glfwDestroyWindow(ptr);
    }

}

std::unique_ptr<GLFWwindow, DestroyglfwWin> my_window;

使用typedefed智能指针非常方便。

typedef std::unique_ptr<GLFWwindow, DestroyglfwWin> smart_GLFWwindow;

smart_GLFWwindow my_window;

答案 1 :(得分:5)

您可以使用自定义删除工具。

std::unique_ptr<GLFWwindow, glfwDestroyWindow>

答案 2 :(得分:5)

  

但我不知道为什么它不像......

那是因为GLFW是用C而不是C ++编写的。这两个是完全不同的语言,其中有一些重叠,其中声明有效,但即便如此,也有很大差异,正如你所见。

在C structenum中,每个都位于自己的标记命名空间中,您必须明确地将struct name_of_the_struct …enum name_of_the_enum …写入用它。通过声明此类型定义typedef struct … …,您可以将结构体拉入常规变量并键入命名空间。有些核心C程序员(包括我)认为,不应该这样做。如果您正在编写C ++,那么您正在编写C ++,如果您正在编写C语言,那么您正在编写C语言并且没有将这两者混合起来的危险。

  

前者形成前瞻性声明的亲是什么?

写C时保存几个按键。就是这样......

  所以真正的问题,由于结构GLFWwindow只是一个声明,唯一指针无法完成模板专业化而无需定义。我不能使用unique_ptr来声明任何指针。

unique_ptr不仅仅是结构定义。 A unique_ptr(由我强调):

  
    

std :: unique_ptr是一个智能指针,当unique_ptr超出范围时,它通过指针保留对象的唯一所有权并销毁该对象。没有两个unique_ptr实例可以管理同一个对象。

  

通过在对象上调用delete来进行销毁,而对象又调用析构函数。在C ++中struct实际上是默认的所有公共class es,因此构造函数/析构函数语义按预期工作。但在普通的C中,结构只是简单的记忆。所以unique_ptr的语义并不真正适用。你需要一些辅助类,它增强了构造函数/析构函数的语义。请参阅ratchet_freak的答案。