2011-01-06 14 views
0

をポインタを作成し、それは私がそれを修正する方法を理解しないコンパイルエラーを持っている私は新しいクラスにC++私は問題を抱えている新しいクラスに

class AnalyzerManager 
{ 

public: 

    AnalyzerManager(); 
    ~AnalyzerManager(); 
private: 
    CAnalyzerIF* m_AnalyzerIF = new CAnalyzerIF(); 

}; 

をポインタを作成するこのコードを小枝。 ありがとう

+1

コンパイルの問題を乗り越えたら、C++の "Rule of Three"を調べます。 – aschepler

+0

はい、スマートポインタを使用するときに再生される[Big Two](http://www.artima.com/cppsource/bigtwo.html)ルール –

答えて

4

ポインタは、クラス宣言ではなく、コンストラクタで初期化する必要があります。

AnalyzerManager::AnalyzerManager() : m_AnalyzerIF(new CAnalyzerIF()) 
{ 
} 

ところで、あなたはこのような何かのためにsmart pointersに見たいと思うかもしれません。

+0

と私はティティinitiraizeより多くの1つのクラスを私はそれを行うことができますか? – adir

+0

@adir:複数のメンバー変数を意味しますか?あなたは確かにイニシャライザをリストに追加することができます。それらはカンマで区切られています。 –

0

あなたが書いたようにすることはできません。私は宣言で正しいことを意味する。

CAnalyzerIF* m_AnalyzerIF = new CAnalyzerIF(); 

代わりに、コンストラクタAnalyzerManager()で行う必要があります。

AnalyzerManager::AnalyzerManager() 
{ 
    m_AnalyzerIF = new CAnalyzerIF(); 
    // ... and some more initialization ... 
} 
+2

初期化子のリストでそれを行うほうがよいでしょう。 –

1
// in AnalyzerManager.h 
#include <memory> 

class AnalyzerManager 
{ 
public: 
    AnalyzerManager(); 
    ~AnalyzerManager(); 

// since you are declaring a custom constructor and destructor, you should also define a custom copy-constructor and copy-assignment 
AnalyzerManager(const AnalyzerManager& rhs); 
AnalyzerManager& operator= (const AnalyzerManager& rhs); 
private: 
    std::shared_ptr<CAnalyzerIF> m_AnalyzerIF; 
}; 

// in AnalyzerManager.cpp 
AnalyzerManager::AnalyzerManager() : m_AnalyzerIF(new CAnalyzer) 
{ 

} 

AnalyzerManager::~AnalyzerManager() 
{ 
    // nothing to do since shared_ptr will clean up the memory for us 
} 

AnalyzerManager::AnalyzerManager(const AnalyzerManager& rhs) : m_AnalyzerIF(rhs.m_AnalyzerIF) 
{ 

} 

AnalyzerManager& AnalyzerManager::operator= (const AnalyzerManager& rhs) 
{ 
    m_AnalyzerIF = rhs.m_AnalyzerIF; 
return *this; 
} 
+0

これにはC++ 0xが必要です。それ以外の場合は、boost :: shared_ptrまたはstd :: tr1 :: shared_ptrを使用します。 –

+0

私はこの行を理解できませんでした:AnalyzerManager&operator =(const AnalyzerManager & rhs); – adir

+0

@Fred:ああ、ありがとう、私はそのキャビアを追加するのを忘れました:) @adir:コピー代入演算子を宣言します。原則として、カスタムコンストラクタまたはデストラクタを宣言する場合は、カスタムコピーコンストラクタとコピー代入演算子も宣言する必要があります。詳細については、3つのルールを参照してください。 –

1

あなた自身に尋ねることから始める必要があります。私はこの「新しい」文が実行されるようにしたいですかいつですか?

アナライザがAnalyzerManagerオブジェクトの構築中であると仮定すると、 'new'の場所はAnalyzerManagerのコンストラクタにあります。メンバ変数を初期化するコンストラクタに置か

コードは、一般的に次のように、メンバー初期化リストを使用して行われます:

AnalyzerManager::AnalyzerManager() : m_AnalyzerIF(new CAnalyzerIF()) 
{ 
} 

あなたが「削除」場所「新しい」に考慮する必要がある使用しているので行きます - おそらくAnalyzerManagerデストラクタで:

AnalyzerManager::~AnalyzerManager() 
{ 
    delete m_AnalyzerIF; 
} 
関連する問題