gpt4 book ai didi

c++ - 使用默认拷贝构造函数会破坏C++中的树

转载 作者:行者123 更新时间:2023-12-02 09:51:49 25 4
gpt4 key购买 nike

例如:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

struct TreeNode {
vector<TreeNode> children;
string name;
};

int main() {
TreeNode leafNode;
leafNode.name="c";
TreeNode middleNode;
middleNode.name="b";
middleNode.children.push_back(leafNode);
TreeNode rootNode;
rootNode.name="a";
rootNode.children.push_back(middleNode);
rootNode=rootNode.children[0];
cout <<rootNode.name <<endl;
}
在CLANG和GCC中输出 c。当然,我希望它能输出 b。这里发生了什么?

最佳答案

正如其他人在注释中指出的那样,您应该实际上尝试设置调试器并首先调试代码。这就是您从编程中学到很多东西的方式。
但是,如果您不习惯调试,则可能很难找到问题,因为相关代码是编译器生成的。
您认为复制构造函数或多或少会破坏您的数据是正确的。但这不是编译器的错。
默认的复制构造函数通过引用接受其参数,并且您将rootNode成员的引用传递给rootNode的复制构造函数。因此,实际上您正在用对象本身的一部分覆盖对象。
在分配或复制期间或多或少会发生什么:

TreeNode(const TreeNode& other) {
children = other.children;
name = other.name;
}
因此,如果将 rootNode.children[0]传递给此操作,则将其有效地减少为:
rootNode.children = rootNode.children[0].children; // copies the children of 'b' to 'a'
rootNode.name = rootNode.children[0].name; // children[0] now refers to the first
// of 'b's children, so name will be 'c' !!
可能的解决方法是先使用以下方法创建真实副本: rootNode = TreeNode{ rootNode.children[0] };该行为可能会有所不同,具体取决于编译器。在VS2019中,尝试您的示例时输出为空。

关于c++ - 使用默认拷贝构造函数会破坏C++中的树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63951270/

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