如何将具有嵌套类的类的实例复制到外部类,该嵌套类包含指向外部类的指针成员
How do I copy an instance of a class with a nested class containing a pointer member to the outer class?
这里是新手C++程序员。假设我有一个类Outer和一个嵌套类Inner。内部包含一个指针成员,在构造过程中设置为外部。Outer包含一个函数AddNewInner(),该函数创建一个指向自身的新Inner并将其添加到向量中。
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添加到向量中时,这一操作效果良好。然而,当我尝试创建Outer实例的副本时,我遇到了一个问题:Inners的Outer副本的向量不指向副本(本身),它们仍然指向原始的Outer。
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的向量指向副本,而不是原始副本。实现这一点的最佳方法是什么,或者也许有其他方法可以做同样的事情?
正确,这是预期行为。在C++中创建对象的副本时,编译器使用复制构造函数。如果你还没有为一个类编写自己的复制构造函数,那么它使用编译器生成的副本构造函数,它只是依次为每个成员运行(可能生成的)副本构造函数。
因此,当复制Outer
时,事件序列如下所示:
- 编译器为
Outer
运行(生成的)副本构造函数 - 这将运行
std::vector
的复制构造函数。此构造函数为新向量分配存储,然后依次为每个元素运行复制构造函数 - 因此,
Inner
的(生成的)复制构造函数为每个元素运行,它只是复制成员指针(仍然指向原始Outer
)
为了在复制Outer
时更新Inner
元素,您需要为Outer
编写一个自定义复制构造函数,根据需要更新指针。类似的东西:
Outer::Outer(const Outer& other)
: mInnersVec(other.mInnersVec) // Do initial vector copy
{
// Update vector elements
for (auto& elem : mInnersVec) {
elem.mOuterParent = this;
}
}
请注意,无论何时编写自定义复制构造函数,几乎总是需要编写自定义赋值运算符。我建议你读一下你最喜欢的C++教材中的临摹和作业:-)。
您需要为类使用自定义的复制构造函数/赋值运算符。这将允许您对Outer* mOuterParent
变量进行深入复制;可能会创造一个新的。
当您复制指针时,您正在复制一个指向内存中特定地址空间的变量。复制指针只允许您通过两个"访问器变量"访问同一个"true变量"。
在您的示例中,特定outer
对象的Outer* mOuterParent
变量将始终指向该指针所指向的outer
类的同一实例化,无论您制作该特定对象的多少副本。
- 嵌套在类中时无法设置成员数据
- 无法访问嵌套类.类的使用无效
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中搜索嵌套多映射值
- 在C++中将矢量转换为嵌套地图
- C++嵌套if语句,基本货币交换
- C++ 在外部使用嵌套结构实现类函数
- 另一个类中嵌套模板的外部实例化
- C++嵌套循环,外部有变量
- LLVM - 如何使嵌套函数看到外部函数的变量
- c++嵌套类未解析的外部符号
- 模板化方法中使用的嵌套类的未解析外部符号
- 外部具有动态分配的嵌套类中的类
- C++ 嵌套'if'语句中的所有代码都会运行,即使这会更改外部语句的布尔值?
- 嵌套的向量迭代忽略外部向量位置
- 为什么我必须为嵌套匿名名称空间中的函数指定外部名称空间
- OpenMP -嵌套for循环在外部循环之前并行时变得更快.为什么
- 从内部到外部展开嵌套宏