![](/img/trans.png)
[英]How to implement two classes for automatic decision over deep and shallow copy?
[英]How to implement deep and shallow copy constructors without using a boolean parameter?
我有以下課程:
class A {
int small;
std::shared_ptr<B> big;
};
這里, B
是一個類,其對象預計具有非常大的尺寸。 在我的程序中,我有一個A
類的原始對象,然后制作它的多個副本,然后復制副本等。
有時,我需要做一個深拷貝,因為所有成員都可能被修改。 其他時候,我知道我不會對A::big
進行任何更改,因此我只想復制指針以節省資源(分析器向我表明這是一個瓶頸)。
目前,我有以下幾點:
A(const A& other, bool doDeepCopy):
small{other.small}, big{doDeepCopy ? std::make_shared<B>(*other.big) : other.big} {}
我知道使用bool
參數被認為是不好的風格,但我不知道還能做什么。 默認的復制構造函數創建一個淺拷貝,我可以將它封裝在一個函數AA::makeShallowCopy()
。 但是另一個構造函數應該是什么樣子的呢? 它需要的唯一輸入是A
類型的對象,但我顯然不能有兩個具有相同簽名的函數。
假設 B 有一個復制構造函數,只需添加:
class A {
int small;
std::shared_ptr<B> big;
public:
A clone() const {
return { small, std::make_shared<B>(*big) };
}
};
因此clone()
成為深度復制數據的唯一方法。
這是在 OpenCV 和 Eigen 中用於矩陣的方法:默認情況下副本是淺的,對於深副本需要顯式調用replicate()
或clone()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.