12

私はこのようなクラスを持っています:

class Inner;

class Cont
{
public:
    Cont();
    virtual ~Cont();
private:
    Inner* m_inner;
};

.cpp では、コンストラクターがInnerwithのインスタンスを作成しnew、デストラクターがそれをdeletes します。これはかなりうまくいっています。
このコードを使用するように変更したいので、次のauto_ptrように記述します。

class Inner;

class Cont
{
public:
    Cont();
    virtual ~Cont();
private:
    std::auto_ptr<Inner> m_inner;
};

これで、コンストラクターが を初期化しauto_ptr、デストラクタは何もしません。

しかし、うまくいきません。このクラスをインスタンス化するときに問題が発生するようです。次の警告が表示されます。

警告 C4150: 不完全な型 'Inner' へのポインターの削除。デストラクタが呼び出されていません

ええと、これは明らかに非常に悪いことであり、私はそれが起こる理由を理解していInnerます.auto_ptr<Inner>

だから私の質問:auto_ptr単純なポインターだけを使用するバージョンで行ったように、前方宣言で使用する方法はありますか?
ポインターを宣言する#includeすべてのクラスに対して行うことは、非常に面倒で、時には不可能なこともあります。この問題は通常どのように処理されますか?

4

7 に答える 7

13

実装が配置さclass Innerれているファイルにヘッダー定義を含める必要があります。Cont::~Cont()このようにして、ヘッダー定義に前方宣言がclass Contあり、コンパイラはclass Inner定義を見て、デストラクタを呼び出すことができます。

//Cont.h
class Inner; // is defined in Inner.h
class Cont 
{ 
    virtual ~Cont(); 
    std::auto_ptr<Inner> m_inner;
};

// Cont.cpp
#include <Cont.h>
#include <Inner.h>

Cont::~Cont()
{
}
于 2009-12-23T10:28:01.050 に答える
4

問題が発生するのは、c'tor をインラインにした場合のみです。c'tor を cpp に入れれば、Innerすべての decleration の後、問題ありません。

于 2011-06-06T13:10:20.800 に答える
3

代わりに boost::shared_ptr() を検討してください。パフォーマンスの代わりに実際的な欠点はなく、宣言を転送する方がはるかに使いやすいです。

boost::shared_ptr<class NeverHeardNameBefore> ptr;

上記の余分な宣言なしで大丈夫です。

shared_ptr は、参照カウントなど、auto_ptr よりも多くのことを行いますが、必要がない場合でも害はありません。

于 2009-12-23T10:32:12.450 に答える
3

#include <memory>ばかげているようですが、 Cont.h ファイルに追加することで同じ問題を解決しました。

于 2012-12-05T12:45:28.830 に答える
2

他の人が指摘したように、cont.cpp ファイルにデストラクタを実装し、inner.h を含める場合、ヘッダーの前方宣言は問題ありません。

Cont の使用に問題がある可能性があります。Cont を使用 (および破棄) する各 cpp には、cont.h と inner.h を含める必要があります。それは私の場合の問題を解決しました。

于 2011-06-15T08:30:00.743 に答える
0

不完全な型で標準ライブラリ テンプレートをインスタンス化することは技術的に想定されていませんが、これが機能しない実装はありません。実際には、Sharptooth の回答もお勧めします。

デストラクタで delete を呼び出す限り、impl ポインタにネイキッド ポインタを使用しても問題はありませんでした。おそらく、コピー コンストラクターと代入演算子も実装または無効にする必要があります。

于 2009-12-24T01:45:46.850 に答える
0

この質問(プライベート デストラクタでオブジェクトを削除する)とこの質問(iscomplete テンプレートの書き方) が役立つ場合があります。

于 2009-12-23T10:46:54.373 に答える