gpt4 book ai didi

c++将指针从构造函数传递给构造函数

转载 作者:行者123 更新时间:2023-11-28 01:33:26 25 4
gpt4 key购买 nike

我正在学习 C++,我创建了 3 个类:NodeEditor、Node、NodeIO。

本质上,编辑器包含一个节点 vector ,每个节点都有一个 NodeIO 实例 vector 。

我希望每个类(class)都能在那里引用“所有者”。

基本上,NodeIO 构造函数从其所在的节点获取一个指针,该节点从其所在的编辑器获取一个指针。

class NodeEditor {
NodeEditor() {
...push_back(Node(this));
}
}

class Node {
NodeEditor* owner;
Node(NodeEditor* _owner) : owner{ _owner } {
...push_back(NodeIO(this));
}
}

class NodeIO {
Node* owner;
NodeIO(Node* _owner) : owner{ _owner } { }
}

然后我需要稍后使用 _owner 指针。

当我在我的项目中尝试这样做时,起初 _owner 指针指向正确的位置,但是一旦我需要稍后检索它,实际对象就不再存在于该指针位置。

要让这种布局发挥作用,我有哪些选择?在这种情况下是否有更推荐的不同模式可供遵循。

最佳答案

您还没有显示任何复制构造函数。据此,我假设您依赖于编译器提供的默认复制构造函数。这就是问题的根源。

当您使用时:

    ...push_back(Node(this));

NodeEditor ,您正在存储 Node(this) 的拷贝.但是,如果 NodeNodeIO没有正确实现复制构造函数,NodeIO Node 中的对象std::vector 中的对象将指向 Node无效的对象 -- 临时 Node对象。


这是一个显示问题的示例程序。

#include <iostream>
#include <vector>

struct Node;

struct NodeIO {
Node* owner;
NodeIO(Node* _owner) : owner{ _owner } { }
};

struct NodeEditor;

struct Node {
NodeEditor* owner;
Node(NodeEditor* _owner) : owner(_owner)
{
std::cout << (void*)this << std::endl;
nodeIOList.push_back(NodeIO(this));
nodeIOList.push_back(NodeIO(this));
}

std::vector<NodeIO> nodeIOList;
};

struct NodeEditor {
NodeEditor()
{
nodeList.push_back(Node(this));
nodeList.push_back(Node(this));
}
std::vector<Node> nodeList;
};

int main()
{
NodeEditor editor;
for ( auto& node : editor.nodeList )
{
std::cout << (void*)(&node) << std::endl;
for (auto& nodeIO : node.nodeIOList )
{
std::cout << (void*)(nodeIO.owner) << std::endl;
}
}
}

输出:

0x7ffe53d34c30
0x7ffe53d34c50
0xae10c0
0x7ffe1af7a2a0
0x7ffe1af7a2a0
0xae10e0
0x7ffe1af7a2c0
0x7ffe1af7a2c0

输出清楚地显示了指向 Node 的指针的值使用 Node(this) 构建的对象和指向 Node 的指针的值存储在 std::vector<Node> 中的对象.请注意 NodeIO对象仍然指向临时 Node对象。它们是 main 中的悬挂指针.


我尝试了快速修复,但没有用。我需要在这方面多做一些工作。


这是一个适用于默认复制构造函数的解决方案。它使用 std::vectorstd::shared_ptr s 而不是 std::vector对象。

#include <iostream>
#include <vector>
#include <memory>

struct Node;

struct NodeIO {
Node* owner;
NodeIO(Node* _owner) : owner{ _owner } { }
};

struct NodeEditor;

struct Node {
NodeEditor* owner;
Node(NodeEditor* _owner) : owner(_owner)
{
std::cout << (void*)this << std::endl;
nodeIOList.push_back(std::make_shared<NodeIO>(this));
nodeIOList.push_back(std::make_shared<NodeIO>(this));
}

std::vector<std::shared_ptr<NodeIO>> nodeIOList;
};

struct NodeEditor {
NodeEditor()
{
nodeList.push_back(std::make_shared<Node>(this));
nodeList.push_back(std::make_shared<Node>(this));
}
std::vector<std::shared_ptr<Node>> nodeList;
};

int main()
{
NodeEditor editor;
for ( auto& node : editor.nodeList )
{
std::cout << (void*)(node.get()) << std::endl;
for (auto& nodeIO : node->nodeIOList )
{
std::cout << (void*)(nodeIO.get()->owner) << std::endl;
}
}
}

输出:

0x1460c30
0x1461110
0x1460c30
0x1460c30
0x1460c30
0x1461110
0x1461110
0x1461110

关于c++将指针从构造函数传递给构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50547238/

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