gpt4 book ai didi

c++ - 如何使用嵌套类复制包含外部成员的指针成员的类的实例?

转载 作者:行者123 更新时间:2023-12-03 07:17:17 24 4
gpt4 key购买 nike

新手C++程序员在这里。假设我有一个嵌套的内部类的Outer类。内部包含在构造期间设置为外部的指针成员。外层包含一个函数AddNewInner(),该函数创建一个指向其自身的新内层并将其添加到 vector 中。

class Outer {

public:

class Inner {
public:
Inner(Outer* outerParent) : mOuterParent(outerParent) {}
Outer* mOuterParent;
}

void AddNewInner() {
Inner newInner(this);
mInnersVec.push_back(newInner);
}

vector<Inner> mInnersVec;
}

在创建新的Outer实例并调用AddNewInner()以将Inners添加到 vector 中时,这可以很好地工作。但是,当我尝试创建外层实例的副本时遇到了一个问题:外层副本的Inners vector 不指向该副本(本身),而是仍然指向原始外层。
Outer outerA;
outerA.AddNewInner();
Outer* ptrA = outerA.mInnersVec[0].mOuterParent; // this points to outerA, good!

Outer outerB = outerA;
Outer* ptrB = outerB.mInnersVec[0].mOuterParent; // this still points to outerA, bad!

我需要副本中的Inners vector 指向副本,而不是原始副本。达到此目的的最佳方法是什么,或者是否有另一种方法可以完成相同的事情?

最佳答案

正确,这是预期的行为。在C++中创建对象的副本时,编译器将使用副本构造函数。如果尚未为类编写自己的副本构造函数,则它将使用编译器生成的副本构造函数,该副本构造函数只是依次为每个成员运行(可能生成的)副本构造函数。

因此,在复制Outer时,事件序列如下所示:

  • 编译器运行Outer的(生成的)复制构造函数
  • 这将运行std::vector的副本构造函数。此构造函数为新 vector 分配存储空间,然后依次为每个元素运行复制构造函数
  • 因此,Inner的(生成的)复制构造函数为每个元素运行,该元素仅复制成员指针(仍指向原始Outer)。

  • 为了在复制 Inner时更新 Outer元素,您需要为 Outer编写一个自定义副本构造函数,该构造函数可以根据需要更新指针。像这样:
    Outer::Outer(const Outer& other)
    : mInnersVec(other.mInnersVec) // Do initial vector copy
    {
    // Update vector elements
    for (auto& elem : mInnersVec) {
    elem.mOuterParent = this;
    }
    }

    请注意,每当编写自定义副本构造函数时,几乎总是也需要编写自定义赋值运算符。我建议在您最喜欢的C++教科书(-)中阅读有关复制和分配的内容。

    关于c++ - 如何使用嵌套类复制包含外部成员的指针成员的类的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38560075/

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