2017-08-08 41 views
0

我創建了一個名爲p_pointer的指針類,並創建了一個向量來保存p_pointer類型。但是,當我嘗試使用push_back函數時,它不起作用。我試圖直接使用double*而不是p_pointer (double),而push_back函數確實可以這樣工作。所以我的猜測是我的拷貝構造函數有問題?無法將指針推回到向量中

template<class T> 
class p_pointer{ 
private: 
    T* cp; 
    size_t* refptr; 

public: 
    //default constructor 
    p_pointer() : cp(0), refptr(new size_t(1)){} 

    //copy constructor 
    p_pointer (p_pointer&s) : cp(s.cp), refptr(s.refptr){ 
     *++refptr; 
    } 

    //assignment operator 
    p_pointer& operator=(const p_pointer& s){ 
     ++*s.refptr; 
     //freeing the left hand size if it is the last one 
     if(--*refptr == 0){ 
      delete cp; 
      delete refptr; 
     } 
     cp = s.cp; 
     refptr = s.refptr; 
    } 

    //other assignment operator 
    p_pointer& operator=(T* s){ 
     if(--*refptr == 0){ 
      delete cp; 
      delete refptr; 
     } 
     cp = s; 
     refptr = new size_t(1); 
    } 

}; 


int main() 
{ 
    p_pointer<double> temp; 
    temp = new double(1); 

    std::vector<p_pointer<double> > collection; 
    collection.push_back(temp); //error at here 
} 
+7

我們應該猜測錯誤信息嗎? –

+0

不應該'p_pointer(p_pointer&s)'是'p_pointer(const p_pointer&s)'? – PeterT

回答

1

你 「的拷貝構造函數」 實際上沒有拷貝構造函數:

//copy constructor 
p_pointer (p_pointer&s):cp(s.cp),refptr(s.refptr){ 
*++refptr; 
} 

應該接受const ref,而不是ref

有效的拷貝構造函數是:

//copy constructor 
p_pointer (const p_pointer&s):cp(s.cp),refptr(s.refptr){ 
*++refptr; 
} 

還存在

//other assignment operator 
p_pointer&operator=(T* s){ 

應該返回的東西,*this例如編譯錯誤。

+0

感謝您的回答,您的解決方案確實有效......後續問題,我一直認爲const只是我們承諾我們不會更改函數中的常量參數。因此,將參數聲明爲常量但不是必須這樣做。但是在這種情況下,您已經顯示代碼只能在添加了const的情況下工作。這是複製構造函數的情況還是我出錯了? – Esther

+0

@Esther _這是複製構造函數的情況嗎?_是的,複製構造函數只能與'const'一起使用。對於另一種情況(方法,自定義構造函數等),您可以自由選擇,何時使用'const' – ikleschenkov