2017-02-23 8 views
0

コンストラクタ(B)の定義をヘッダB.hに移動しない限り、コードはファイルとして機能します。Pimpl with unique_ptr:インターフェイスのコンストラクタの定義を ".cpp"に移動する必要があるのはなぜですか?

B.h

class Imp; //<--- error here 
class B{ 
    public: 
    std::unique_ptr<Imp> imp; 
    B();  //<--- move definition to here will compile error 
    ~B(); 
    //// .... other functions .... 
}; 

B.cpp

#include "B.h" 
#include "Imp.h" 
B::B(){ } 
~B::B(){ } 

Imp.h

class Imp{}; 

M ain.cpp(私をコンパイル)

#include "B.h" 

Error: deletion of pointer to incomplete type
Error: use of undefined type 'Imp' C2027

私は何とかImpのdestructureが呼ばれるかもしれないので、デストラクタは、.cppに移動しなければならないことを理解することができます -

delete pointer-of-Imp; //something like this 

しかし、私はなぜこのルールもコンストラクタをカバーしています(質問)。

私が読んでいる: -

+0

重要なのはデストラクタ*です。 –

+0

@Kerrek SBコンストラクタは重要ではありませんか? – javaLover

+1

OT: 'B'の中に' Imp'を入れます。 'class {public:' == 'struct {' –

答えて

2

例外によって終了する場合、コンストラクタはクラスメンバを破棄する必要があります。

コンストラクタをnoexceptにすると助けになるとは思えませんが、多分そうすべきです。

+0

ありがとう!どうにかして賢明!アルゴリズムはどこにありますか?例えばそれは標準ライブラリにあるかコンパイラに埋め込まれていますか? – javaLover

+0

@ javaLoverコンパイラの深いところに埋め込まれています。メンバコンストラクタがスローすると、(宣言順で)前のメンバが破棄されます。コンストラクタ本体がスローすると、すべてのメンバーが破棄されます。 – Potatoswatter

関連する問題