[英]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
的相應元素的引用成員。
我的問題是, 是否有一種更清潔/更簡單/更優雅的方式? 如果沒有,我將重構我的設計以使用數組索引而不是整個引用。
也許我不應該使用引用成員-我知道有人說使用指針總是更好。 如果我使用指針而不是引用,是否有更好的解決方案? (我看不到,但我不知道。)
您可以為A
提供一個賦值運算符(和副本ctor), A
運算符串聯處理c_array
和b_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.