2017-10-17 24 views
0

こんにちは(英語は私の母国語ではありませんので、間違えても分かります!ありがとうございます!)C++テンプレートクラス、特定の状況のコピーコンストラクタを宣言する方法は?

私はポインタを含むことができるテンプレートクラスを作成しています。

template <typename T> 
class SmartPtr { 
private: 
     T value; 
public: 
     SmartPtr() {}; 
     ~SmartPtr() {}; 

    SmartPtr(T* a) 
    { 
     this->value = *a; 
    } 
    SmartPtr(SmartPtr* a) 
    { 
      this->value = a->get_Value(); 
    } 
    SmartPtr(SmartPtr const* a) 
    { 
      this->value = a->get_Value(); 
    } 

    T get_Value()const{ 
      return this->value; 
    } 
}; 

これはSmartPtrというテンプレートクラスであり、かつ

class Test 
{ 
public: 
     Test() { std::cout << "Test::Test()" << std::endl; } 

     Test(Test const&) { std::cout << "Test::Test(Test const&)" << std::endl; } 

     ~Test() { std::cout << "Test::~Test()" << std::endl; } 

     Test& operator=(Test const&) 
     { 
      std::cout << "Test& Test::operator=(Test const&)" << std::endl; 
      return *this; 
     } 

     void print() const { std::cout << "Test::print() const" << std::endl; } 
     void print() { std::cout << "Test::print()" << std::endl; } 
}; 

これは私のテストクラスです。

私は私のmain.cppにして

SmartPtr<Test> ptr_t1 = SmartPtr<Test>(new Test);を宣言し、

コンパイルした後の結果が

Test::Test() 
Test::Test() 
Test& Test::operator=(Test const&) 
Test::~Test() 

ですが、私が取得したい結果が

Test::Test() 
Test::~Test() 

です私は私が書く必要がある特定のテンプレートクラスのコピーコンストラクタがありますか?この状況?

ご理解いただきありがとうございます。

+0

この疑問を参照してください。しかし、もし直接的なものであれば確かではありません:https://stackoverflow.com/questions/926752/why-should-i-prefer-to-use-member-initialization-list – Rakete1111

+1

'this-> value = * a; 'は割り当てです.... – StoryTeller

+0

@StoryTellerコメントありがとうございました。申し訳ありませんが、C++で10日間、知識が不足しています。私は任命をしてはいけないのですか? –

答えて

2

理由はSmartPtr内部のvalueメンバ変数があるれている。

template <typename T> 
class SmartPtr { 
private: 
     T value; // here T is of class Test 
... other stuff ... 
} 

SmartPtr<Test> ptr_t1 = SmartPtr<Test>(new Test); 

ptr_t1を宣言するので、値だ構成で構成されています。つまり、最初のTest()コンストラクタ呼び出しです。 2番目のコンストラクタはnew Test(明らかに)です。 次に、SmartPtrが構築され、内部でthis->value = *a;Test()代入演算子を呼び出します。

最後にSmartPtr<Test>(new Test)オブジェクトが破棄され、内部のvalueオブジェクトでデストラクタが呼び出されます。

また、new Testと呼ばれていたが、deleteがないため、メモリリークもあります。

+0

最後に質問してください。だから、 "value"メンバーはT値ではなくT *値でなければなりませんか? –

+0

はい、SmartPtrのデストラクタは '値を削除'する必要があります –

+0

ありがとうございました。良い一日を! –

0

呼び出される唯一のコンストラクタとデストラクタためには、単に直接コンストラクタを呼び出す:

SmartPtrのptr_t1(新しいテスト)。

また、あなたのSmartPtrクラスはポインタの代わりに、値を格納する必要があります。この値は、newへの呼び出しによって割り当てられたメモリに存在します。代わりに:

プライベート:T値;

書き込み:

プライベート:T *値;

これは、値がコンストラクタによってコピーされるのではなく、ただに指摘されていることを確認します。値はまだnewによって割り当てられたメモリに存在します。

関連する問題