C++ 将唯一_ptr与GLFWwindow一起使用

C++ 将唯一_ptr与GLFWwindow一起使用,c++,opengl,glfw,C++,Opengl,Glfw,我正在使用GLFW处理应用程序中的窗口事件。它很好用。后来我决定从GLFWwindow开始删除原始指针。它在文件glfw3.h中定义为: typedef struct GLFWwindow GLFWwindow; 我在头文件中找不到结构的实际定义。所以我假设这是一种前瞻性声明,但我不知道为什么它不是这样 struct GLWwindow; 我试图用后一种形式的转发声明来代替前一种形式。它编译得很好。前一种远期申报的形成原因是什么 所以真正的问题是,由于GLFWwindow的结构只是一个声明

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

typedef struct GLFWwindow GLFWwindow; 
我在头文件中找不到结构的实际定义。所以我假设这是一种前瞻性声明,但我不知道为什么它不是这样

struct GLWwindow;
我试图用后一种形式的转发声明来代替前一种形式。它编译得很好。前一种远期申报的形成原因是什么

所以真正的问题是,由于GLFWwindow的结构只是一个声明,唯一指针不能在没有定义的情况下完成模板专门化。我不能使用unique_ptr声明任何指针。编译器给了我一个错误

C2027 use of undefined type 'GLFWwindow'
C2338 can't delete an incomplete type
C4150 deletion of pointer to incomplete type 'GLFWwindow';no destructor called
有人知道如何在GLFWwindow中使用唯一指针吗


谢谢

您需要向唯一的ptr提供删除器:

struct DestroyglfwWin{

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

}

std::unique_ptr<GLFWwindow, DestroyglfwWin> my_window;
struct DestroyglfwWin{
void运算符()(GLFWwindow*ptr){
GLFW窗口(ptr);
}
}
std::唯一的\u ptr我的\u窗口;
使用类型定义的智能指针非常方便

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

smart_GLFWwindow my_window;
typedef std::unique_ptr smart_GLFWwindow;
智能窗口我的窗口;
但我不知道为什么它不像

这是因为GLFW是用C写的,而不是C++。这两种语言是完全不同的,声明的工作方式有一些重叠,但正如您所看到的,即使如此,也有很大的不同

在C
struct
s和
enum
s中,它们都位于各自的标记命名空间中,您必须显式地写入结构的
struct name\u…
或枚举的
enum name\u…
才能使用它。通过声明此类型定义
typedef struct……
可以将结构拉入常规变量和类型名称空间。有些硬核C程序员(包括我)认为不应该这样做。如果你正在写C++,你在写C++,如果你在写C,你就写C,没有把两者混合的危险。 前一种远期申报的形成原因是什么

在编写C时保存一些击键。就是这样

所以真正的问题是,由于GLFWwindow的结构只是一个声明,唯一指针不能在没有定义的情况下完成模板专门化。我不能使用unique_ptr声明任何指针

unique\u ptr
不仅仅是拥有结构定义。A
唯一性\u ptr
(由我强调):

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


销毁是通过调用对象上的
delete
,然后调用析构函数来实现的。C++中的代码>结构> <代码> s实际上默认为“代码>类< /COD> ES”,因此构造函数/析构函数语义如预期的那样工作。但在普通C中,结构只是普通内存。因此,
unique\u ptr
的语义实际上并不适用。您需要一些辅助类,以增强构造函数/析构函数语义。请参阅ratchet_freak的答案。

typedef struct GLFWwindow GLFWwindow这是针对C的。在C中,如果您不想每次需要此类型时都写入
struct GLFWwindow
,则需要一个typedef。我认为窗口的指针是使用唯一指针的一种良好实践。指针是独占的。谢谢你的回答,DatenWalf。这真的很有帮助:)感谢您的回答ratchet,错误消息“C2027使用未定义类型”GLFWwindow“让我困惑,让我相信我必须有GLFWwindow的定义才能声明唯一指针。我真的应该注意内存中的代码:static_assert(0