gpt4 book ai didi

c++ - 深度复制包含引用成员的结构 (C++)

转载 作者:行者123 更新时间:2023-11-30 04:07:50 24 4
gpt4 key购买 nike

我有一个 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 中项的引用成员指向 c_array 中项的要求,但除此之外,数据可以是任何内容。重要的是,复制构造函数适用于任何 满足此属性的数据。这不是一个可以通过重用现有的初始化代码来解决的问题。

问题是,如果我只是复制 b_array 中的对象,它们的引用成员将指向 old 实例中的 C 对象A。我需要让它们指向 new 实例中的相应项目。我能想到的唯一方法是:

  • 对于b_array的每个元素,获取其引用成员指向的地址,并将其存储在指针中

  • 使用指针算法计算出该指针对应的数组的索引

  • 使用该索引初始化新b_array对应元素的引用成员。

我的问题是,是否有更清洁/更简单/更优雅的方式?如果没有,我将重构我的设计以使用数组索引而不是整个引用。

也许我不应该使用引用成员——我知道有些人说使用指针总是更好。如果我使用指针而不是引用,是否有更好的解决方案来解决这个问题? (我看不到,但我不知道。)

最佳答案

使用引用的深拷贝必须首先复制值(c_array),然后存储对这些新值的引用。除了您描述的算法之外,我看不到实现此目的的方法。

使用指针而不是引用不会改变这一点。有各种comparisons of pointers vs references .指针初始化起来不那么棘手(创建为 null 并在准备好时分配)并且使用起来更危险(可能仍然是 null)。但是您仍然需要复制对象,然后找到并复制指向它们的链接。

我看不出比使用数组索引更简单/更优雅的方法。使用数组索引,您只需按值复制数组,索引指向哪个对象的结构将为您处理。

关于c++ - 深度复制包含引用成员的结构 (C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22193879/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com