我在 Code Project 上看到了这篇文章,该文章讨论了使用抽象接口作为从 C++ DLL 导出整个类的替代方法,以避免名称损坏问题。作者Release()
在他的接口定义中有一个方法,应该由用户调用以在使用后释放类对象的资源。为了自动调用此方法,作者还创建了一个类似的类,该类在删除对象之前std::auto_ptr<T>
调用该方法。Release()
我想知道以下方法是否可行:
#include <memory>
#if defined(XYZLIBRARY_EXPORT) // inside DLL
# define XYZAPI __declspec(dllexport)
#else // outside DLL
# define XYZAPI __declspec(dllimport)
#endif // XYZLIBRARY_EXPORT
// The abstract interface for Xyz object.
// No extra specifiers required.
struct IXyz
{
virtual int Foo(int n) = 0;
//No Release() method, sub-class' destructor does cleanup
//virtual void Release() = 0;
virtual ~IXyz() {}
};
// Factory function that creates instances of the Xyz object.
// Private function, do not use directly
extern "C" XYZAPI IXyz* __stdcall GetXyz_();
#define GetXyz() std::auto_ptr<IXyz>( GetXyz_() )
当然,GetXyz()
可以是在头文件中定义的全局函数而不是#define
. 这种方法的优点是我们不需要自己制作auto_ptr
调用该Release()
方法的派生词。
谢谢你的回答,阿什。