2012-06-29 46 views
1

我會用std::map<int, A>我可以防止有一些例外的複製構造函數嗎?

A是一類,我必須防止淺拷貝, 但也有很多類,如A,所以使得深拷貝構造和操作員是煩人。 由於看起來我不必使用拷貝構造函數和拷貝賦值操作符 我決定不使用它們。

爲了防止一些錯誤,我做了UnCopyable類,它有私有拷貝構造函數和拷貝賦值操作符,並且A繼承它。

但是,有一個問題。 std::map使用複製構造函數。

我不想在地圖上保存A的指針。

什麼是更好的解決方案?

+1

如果是您關心的顯式刪除,則可以將智能指針('std :: shared_ptr ')存儲爲值而不是原始指針。 – hmjd

+0

爲什麼它不可複製?因爲別人有指向它的指針,或者只是因爲正確的副本需要很深?如果您知道它只能從臨時文件複製,您可能會考慮在複製構造函數中實現「移動」語義。 – Potatoswatter

+0

我通過使用句柄類來解決這個問題。 –

回答

1

你可以使用像std::shared_ptr這樣的智能指針或者寫一個代理類。

如:

class Foo { 
public: 
    std::string name() const; 
}; 

typedef std::shared_ptr<Foo> SharedFoo; 

class SharedFoo { 
public: 
    std::string name() const { return instance->name(); } 
private: 
    std::shared_ptr<Foo> instance; 
}; 
3

你可能會考慮嘗試C++ 11,其中有一對夫婦解決這樣的問題:std::map::emplace從而消除了A能夠複製要求和std::move,它允許您將一個對象轉移到另一個對象而不需要複製。

此外,還有一個新的,更加明確的方式來定義一個類,不可複製:

A(A const &) = delete; 

這是升級你的C++編譯器的好時機。

相關問題