簡體   English   中英

如何在不使用布爾參數的情況下實現深淺拷貝構造函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM