我會用std::map<int, A>
我可以防止有一些例外的複製構造函數嗎?
A
是一類,我必須防止淺拷貝, 但也有很多類,如A
,所以使得深拷貝構造和操作員是煩人。 由於看起來我不必使用拷貝構造函數和拷貝賦值操作符 我決定不使用它們。
爲了防止一些錯誤,我做了UnCopyable類,它有私有拷貝構造函數和拷貝賦值操作符,並且A
繼承它。
但是,有一個問題。 std::map
使用複製構造函數。
我不想在地圖上保存A
的指針。
什麼是更好的解決方案?
我會用std::map<int, A>
我可以防止有一些例外的複製構造函數嗎?
A
是一類,我必須防止淺拷貝, 但也有很多類,如A
,所以使得深拷貝構造和操作員是煩人。 由於看起來我不必使用拷貝構造函數和拷貝賦值操作符 我決定不使用它們。
爲了防止一些錯誤,我做了UnCopyable類,它有私有拷貝構造函數和拷貝賦值操作符,並且A
繼承它。
但是,有一個問題。 std::map
使用複製構造函數。
我不想在地圖上保存A
的指針。
什麼是更好的解決方案?
你可以使用像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;
};
你可能會考慮嘗試C++ 11,其中有一對夫婦解決這樣的問題:std::map::emplace
從而消除了A
能夠複製要求和std::move
,它允許您將一個對象轉移到另一個對象而不需要複製。
此外,還有一個新的,更加明確的方式來定義一個類,不可複製:
A(A const &) = delete;
這是升級你的C++編譯器的好時機。
如果是您關心的顯式刪除,則可以將智能指針('std :: shared_ptr ')存儲爲值而不是原始指針。 – hmjd
爲什麼它不可複製?因爲別人有指向它的指針,或者只是因爲正確的副本需要很深?如果您知道它只能從臨時文件複製,您可能會考慮在複製構造函數中實現「移動」語義。 – Potatoswatter
我通過使用句柄類來解決這個問題。 –