2015-10-19 77 views
1

這是很常見的前置聲明,以避免循環的頭文件的依賴性,或者實現PIMPL,那麼人們可能會用類似的代碼結束:如何將unique_ptr與forward聲明類型一起使用?

class A; 

class B 
{ 
    A * a; 
}; 

當一個人試圖用的unique_ptr取代這個:

class A; 

class B 
{ 
    std::unique_ptr<A> a; 
}; 

編譯器抱怨。什麼是最好的做法,讓這個工作?

+5

您是否閱讀過http://stackoverflow.com/questions/6012157/is-stdunique-ptrt-required-to-know-the-full-definition-of-t? –

+0

只需定義知道完整類型時需要知道的所有內容。 http://coliru.stacked-crooked.com/a/92407ffd3e333a97 –

回答

0

需要聲明封閉類B的析構函數,並將其設置爲源文件中的默認值,以使unique_ptr不強制內聯其自己的默認刪除器。

class B 
{ 
    public: 
    ~B(); 
    private: 
    std::unique_ptr<A> a; 
}; 

和源文件

#include <A.h> 
... do stuff with (a) 
B::~B() = default; 

應該做的工作英寸