簡體   English   中英

從DLL導出前向聲明的類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM