簡體   English   中英

深度復制包含引用成員的結構(C ++)

[英]Deep-copying a structure containing reference members (C++)

我有一個C ++類,其中包含對象,這些對象的引用成員指向該類中的其他對象。 當時這似乎是個好主意,但現在我需要對整個過程進行深層復制,而且我看不出有什么辦法像笨拙的hack一樣。

我的代碼的簡化版本如下所示。 問題是關於為A編寫副本構造函數。

class C {
    int x, y, z; // nothing complicated stored in this class
public:
    // constructor and other methods
};

class B {
    C &c1;
    C &c2;
public:
    // constructor and other methods
};

class A {
    C *c_array;
    B *b_array; // for each item in this array, 
                // its 'c1' and 'c2' fields point to members of c_array.
public:
    // constructor and other methods
};

一些人問過這種結構是如何初始化的,所以請讓我強調,這與回答這個問題無關。 初始化將始終滿足b_array中的項的引用成員指向b_array中的項的c_array ,但除此之外,數據可以是任何東西。 對於所有滿足此屬性的數據,復制構造函數都必須工作,這一點很重要。 這不是可以通過重新使用現有的初始化代碼來解決的問題。

問題是,如果僅復制b_array的對象,則它們的引用成員將指向A實例中的C對象。 我需要使它們指向實例中的相應項目。 我能想到的唯一方法是:

  • 對於b_array每個元素,獲取其引用成員指向的地址,並將其存儲在指針中

  • 使用指針算術算出該指針對應的數組索引

  • 使用該索引初始化新b_array的相應元素的引用成員。

我的問題是, 是否有一種更清潔/更簡單/更優雅的方式? 如果沒有,我將重構我的設計以使用數組索引而不是整個引用。

也許我不應該使用引用成員-我知道有人說使用指針總是更好。 如果我使用指針而不是引用,是否有更好的解決方案? (我看不到,但我不知道。)

使用引用的深層副本必須首先復制值(c_array),然后將引用存儲到這些新值。 除了您描述的算法外,我看不到其他實現方法。

使用指針而不是引用不會更改此設置。 指針與引用之間有各種比較 指針初始化起來比較麻煩(創建為null並在准備好時分配),使用起來更加危險(可能仍然為null)。 但是您仍然必須復制對象,然后找到+復制指向它們的鏈接。

我看不到比使用數組索引更簡單/更優雅的方法。 使用數組索引,您只需按值復制數組的值,以及索引結構將指向您要照顧的對象。

您可以為A提供一個賦值運算符(和副本ctor), A運算符串聯處理c_arrayb_array的更改,假設B可以將C的賦值僅作為參考/指針更新來處理。

可以遵循以下原則:

struct B { ... B& operator=(const C& c) { this->c = &c; return *this; } };

struct A { ...
    A& operator=(const A& a) {
        c_array = a.c_array;
        b_array = a.b_array;
        // re-assign pointers/references only using B's `operator=(const C&)` :
        std::copy_n(c_array.begin(), c_array.size(), b_array.begin());
        return *this;
    }
};

有點混亂,但是: 請看現場示例

請注意,如果您注釋掉std::copy_n行,當然你也可以觀察到,該副本是不沾邊的輸出,也就是b_array復制指向原始的的c_array ,而不是自己的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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