2017-10-17 119 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()構造函數調用。 第二個構造函數是new Test(顯然)。 然後,構建SmartPtr,在裏面,this->value = *a;調用Test()賦值運算符。

最後,SmartPtr<Test>(new Test)對象被銷燬,調用內部對象value上的析構函數。

注意還因爲有一個new Test調用,但沒有delete,也有內存泄漏。

+0

請問最後一個問題,所以「值」成員應該是T *值而不是T值? –

+0

是的,SmartPtr的析構函數應該'刪除值' –

+0

謝謝你的時間。祝你今天愉快! –

0

爲了只有構造函數和析構函數被調用,只需調用構造函數直接:

的SmartPtr ptr_t1(新測試);

另外,您的SmartPtr類應該存儲一個指針而不是值。該值可以駐留在由新調用分配的內存中。代替:

private:T value;

寫:

私人:T *值;

這將確保該值不被拷貝構造函數,而是隻指向。該值仍將駐留在由new分配的內存中。