2017-02-07 40 views
0

我正在開發C++ 11項目。其中我有一個shared_ptr控股std::string數據。需要在使用shared_ptr時實現析構函數,複製構造函數,賦值運算符

class Base { 
public: 
    Base() : Base(string()) {} 
    virtual ~Base() = default; 
    Base(const string &str) { 
    str_ = std::make_shared<string>(str); 
    } 
private: 
    std::shared_ptr<std::string> str_; 
}; 

我的問題是:在這裏,我應該實現析構函數釋放str_,拷貝構造函數和賦值操作符把副本的照顧? 如果我依賴編譯器提供的默認版本,就足夠了嗎? 我想允許Base *b1 = new Base("string");

+2

不,您不需要創建它們。 –

+0

爲什麼使用shared_ptr來保存字符串?你真的想要這個對象的副本引用相同的字符串嗎?如果是這樣,爲什麼? –

+3

您可以依靠編譯器提供的默認實現,因爲默認情況下提供的簡單成員副本就足夠了。 –

回答

1

默認構造函數和賦值運算符(包括複製和移動)的Base b1("string");或堆中創建該類要麼在堆棧的對象將是「正確的」。我把「正確的」在報價的原因是,我有你打算獲得此Base類的類關注(給出的虛析構函數,和名),如果你寫的東西,如:

Base *p1 = new Derived1("foo", "bar"); 
Base *p2 = new Derived1("bar", "foo"); 
*p1 = *p2; // Will compile, but probably won't do what you want. 

具體,作業將複製p2指向的對象的Base部分,但不會複製任何Derived1部件。

我會刪除構造函數和賦值操作符或使其受到保護。

class Base { 
public: 
    Base() : Base(string()) {} 
//Either 
    Base(const Base& rhs) = delete; 
    Base& operator=(const Base& rhs) = delete; 
//OR 
protected: 
    Base(const Base&rhs) = default; 
    Base& operator=(const Base& rhs) = default; 
    Base(Base&&rhs) = default; 
    Base& operator=(Base&& rhs) = default; 
public: 
//END 
    virtual ~Base() = default; 
    Base(const string &str) { 
    str_ = std::make_shared<string>(str); 
    } 
private: 
    std::shared_ptr<std::string> str_; 
}; 
+0

是的,我將從它創建派生類 請詳細說明,爲什麼要「保護」它們或禁用它們? 謝謝 – RuLoViC

+0

因爲如果你不這樣做,那麼'* p1 = * p2'會分配基類值*,但不會派生元素!*。我編輯了答案 –

相關問題