[英]Exporting forward declared classes from a DLL
我想從DLL導出類。 它使用如下的Pimpl習慣用法:
#ifdef THING_EXPORT
#define THING_API __declspec(dllexport)
#else
#define THING_API __declspec(dllimport)
#endif
class thing_impl;
class THING_API thing
{
public:
...
private:
thing_impl* pimpl_;
};
thing_impl
的構造函數或析構函數(或任何方法)在該DLL之外不可用。 我是否必須將THING_API
放在向前聲明的名稱thing_impl
?
我是否必須將
THING_API
放在向前聲明的名稱thing_impl
?
這取決於,但是考慮到pimpl習慣用法的性質,沒有,您不需要導出它。
您可能會收到關於未導出的警告和錯誤, 可以在整個項目中將其靜默或將其限制為成員變量的范圍(如下所示);
class thing_impl;
class THING_API thing
{
public:
...
private:
#pragma warning(push)
#pragma warning(disable: 4251)
thing_impl* pimpl_;
#pragma warning(pop)
};
在實施中考慮的其他因素是申報“平普爾”實現類thing_impl
主內為私人thing
類,以進一步限制潛在的訪問。
class THING_API thing
{
public:
thing(const thing&);
thing& operator=(const thing&);
thing(thing&&); // if needed
thing& operator=(thing&&); // if needed
~thing();
...
private:
class thing_impl;
#pragma warning(push)
#pragma warning(disable: 4251)
thing_impl* pimpl_;
#pragma warning(pop)
};
需要注意的一件事是,從DLL導出類時,整個類都會被導出,因此請確保適當的復制構造函數,復制賦值運算符和析構函數在那里(如上)並已實現(如果需要,還可以移動) )。 如果它們不存在,則編譯器將生成它們,並且鑒於使用pimpl_
成員,它們很可能不正確。 為此,您還可以考慮使用std::shared_ptr
來協助管理pimpl_
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.