我是C ++的新手,需要一些帮助。
我想创建一个处理class
和其他struct
的模板HANDLE
/ WINAPI
到目前为止是这段代码:
template <typename type_to_open, typename returntype, returntype (WINAPI * GlobalFn)(
type_to_open )> class Handle_Wrap {
public:
type_to_open data;
Handle_Wrap (type_to_open in_data) { data = in_data; }
~Handle_Wrap() { returntype (WINAPI * GlobalFn)( type_to_open );}
};
Handle_Wrap <HANDLE, BOOL, ::FindClose> hFind ( FindFirstFileA (pattern.c_str(), &ffd) );
老实说,我认为它的工作和编译器没有给我一个警告:
warning C4101: 'GlobalFn' : unreferenced local variable
我在网上看到了这段代码并对其进行了一些更改,我不知道这是否是正确的方法呢?
答案 0 :(得分:1)
问题出在你的析构函数中。你重复声明
是GlobalFn
,而不是称之为。它应该是:
~HandleWrap() { (*GlobalFn)( data ); }
另外,你想让这个类可复制,移动或 都不是?如果两者都没有,你应该采取措施防止任何 相关编译器生成的默认值;否则,你需要 提供相应的构造函数(可能 赋值运算符)。如果是可复制的,你还需要一些 计数器,在所有副本之间共享,这样只有 最后一个析构函数释放了句柄。对于可移动的(可能是 最好的解决方案,如果你可以肯定有C ++ 11),你会 需要一个移动构造函数,它可以确保执行某些操作 从对象移动的析构函数是一个无操作。
答案 1 :(得分:0)
如何使用标准unique_ptr
std::unique_ptr<HANDLE, ::FindClose> hFind = FindFirstFileA(...);
(或类似的东西)。
我怀疑代码中的问题是编译器没有看到你的GlobalFn
作为函数调用,而是作为protoptype(对于Most Vexing Parse来说是另一个“胜利”) - 你不应该完全使用WINAPI
,只需将其设为模板化函数指针:
模板类Handle_Wrap { ... ~Handle_Wrap(){GlobalFn(data); } };
您可能还想使用添加operator type_to_open() { return data; }
,以便您可以使用FindNextFile(hFind, ...)
,而不必依赖data
公开。