C++ 如何在win32 c+中为句柄为成员的类编写copyconstructor+;应用

C++ 如何在win32 c+中为句柄为成员的类编写copyconstructor+;应用,c++,winapi,copy-constructor,C++,Winapi,Copy Constructor,我的类中有一个句柄作为成员,比如说它是使用win32 api获得的文件句柄,我如何在复制构造函数中处理它,我的类是否负责释放它?如果希望复制句柄,可以在复制构造函数中使用Windows api,在这种情况下,如果不再使用句柄,则调用Closehandle。如果希望复制句柄,则可以在复制构造函数中使用Windows API。在这种情况下,如果不再使用句柄,则调用Closehandle。您遇到此问题,因为您正试图为包含抽象资源的类定义复制构造函数(与值相反)。您必须决定您实际上希望从复制构造函数中获

我的类中有一个句柄作为成员,比如说它是使用win32 api获得的文件句柄,我如何在复制构造函数中处理它,我的类是否负责释放它?

如果希望复制句柄,可以在复制构造函数中使用Windows api,在这种情况下,如果不再使用句柄,则调用Closehandle。

如果希望复制句柄,则可以在复制构造函数中使用Windows API。在这种情况下,如果不再使用句柄,则调用Closehandle。

您遇到此问题,因为您正试图为包含抽象资源的类定义复制构造函数(与值相反)。您必须决定您实际上希望从复制构造函数中获得什么行为。也许您甚至不希望该类在一开始就可以复制构造

例如,考虑您的类封装了一个打开的只读文件。然后,拷贝构造函数调用DuplicateHandle(如Matt所建议的)和析构函数调用CutelHead将是有意义的。在原始实例和复制实例之间不会有干扰,因为您不会编写文件。

另一方面,如果类表示一个临时文件,则可能需要不同的语义-复制构造函数复制整个文件可能会很有用,这样类的副本就不会干扰原始文件。或者,这种行为感觉太含蓄,您决定该类将不具有复制构造函数,而不是ead您必须显式地使用copy方法


因此,除非你解释你到底在做什么,以及你打算使用这个类的方式,否则没有“正确”的答案。

你遇到这个问题是因为你试图为一个包含抽象资源(而不是值)的类定义一个复制构造函数。您必须决定您实际上希望从复制构造函数中获得什么行为。可能您甚至不希望该类在一开始是可复制构造的

例如,考虑您的类封装了一个打开的只读文件。然后,拷贝构造函数调用DuplicateHandle(如Matt所建议的)和析构函数调用CutelHead将是有意义的。在原始实例和复制实例之间不会有干扰,因为您不会编写文件。

另一方面,如果类表示一个临时文件,则可能需要不同的语义-复制构造函数复制整个文件可能会很有用,这样类的副本就不会干扰原始文件。或者,这种行为感觉太含蓄,您决定该类将不具有复制构造函数,而不是ead您必须显式地使用copy方法


因此,除非你解释你到底在做什么,以及你打算使用这个类的方式,否则没有“正确”的答案。

重复句柄在这里可能是最有意义的,正如其他人所建议的那样,但是由于句柄基本上是一个指针,你也可以使用std::shared\u ptr(或者它的boost对应物)使用CloseHandle作为删除程序。然后可以随意复制句柄,并在类的最后一个实例被销毁时自动关闭句柄


请注意,句柄是共享的,因此,如果您修改了它的任何关联状态,您将为引用该句柄的所有实例更改它。如果这是一个问题,我将复制它或完全禁止复制。

DuplicateHandle可能在这里最有意义,正如其他人所建议的那样,但由于句柄基本上是一个指针,您可以ld还使用std::shared_ptr(或它的boost对应项)和CloseHandle作为删除器。然后可以随意复制句柄,并在销毁类的最后一个实例时自动关闭句柄

请注意,句柄是共享的,因此,如果您修改了它的任何关联状态,您将为引用该句柄的所有实例更改它。如果这是一个问题,我将复制它或完全禁止复制