gpt4 book ai didi

c++ - 更改智能指针对象并在之后访问它

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

我目前正在重新设计我最近编写的一个相当复杂的程序。该程序由相互依赖的各种对象组成。我现在想要实现的是更改其中一个对象并将其替换为相同类型但不同属性的对象(例如,在构建新对象期间分配的属性)的功能。

实现此功能的正确方法是什么?

到目前为止我做了什么?

目前我正在使用一个包含一组包含不同对象的 unique_ptr 的“主类”。假设 object1 依赖于 object2,所以在构造期间我通过引用 object1 的构造函数传递包含 object2 的智能指针。
因为我希望能够在构造后访问 object2 的函数,所以我需要以某种方式引用它以供以后使用:

根据我的理解,我不能使用指向底层对象的原始指针,因为它指向某个内存地址,当旧对象被替换时,该地址可能会发生变化。目前我正在尝试使用引用,它引用智能指针本身,它不应该改变它的地址,但应该始终知道 object2 所在的位置。

这是一个选择吗?因为现在我遇到了一个问题,我曾经在 object2 中有指向某些变量的指针(主要是为了更容易编写和阅读代码),但是我很确定我会再次遇到同样的地址问题。在这种情况下,我是否应该在我的第一个引用中使用对变量的引用 - 这是否有效?

我也可以使用引用智能指针的原始指针,但感觉这不是正确的方法。不久前我开始使用 C++,我觉得我可能过度使用了指针,或者我可能没有正确使用智能指针,我不知道 - 所以任何帮助将不胜感激!

最佳答案

你需要做什么,假设所有权是唯一的(所以没有 shared_ptr),这样你的 MasterClass 并且只有 MasterClass 拥有所有实例子对象的方法是使用 unique_ptr 并通过 const 左值引用传递它们,以便您始终能够访问特定子对象的正确地址对象(因为 unique_ptr 也可以用作包装器)。

我的意思是这样的:

class Object2 {
const std::unique_ptr<Object1>& object1;
public:
Object2(const std::unique_ptr<Object1>& object1) : object1(object1) { }
}

class MasterClass {
std::unique_ptr<Object1> object1;
std::unique_ptr<Object2> object2;

MasterClass() : object1(new Object1()), object2(new Object2(object1)) { }

void replace() {
// no problem for Object2
object1.reset(new Object1());
}
}

请注意,如果您需要从不是 MasterClass 的类更改托管对象,则可以使用非 const 引用,但这会暴露一些问题,因为 std::unique_ptr 由非 const 引用传递并不能真正向您保证被调用的函数不会通过移动到它自己的 unique_ptr 或类似的微妙事物来获得所有权。

关于c++ - 更改智能指针对象并在之后访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37334202/

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