更改智能指针对象,然后访问它



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

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

到目前为止我做了什么

目前,我使用的是一个单独的"master类",其中包含一组unique_ptr,其中包含不同的对象。假设object1依赖于object2,所以在构造过程中,我通过引用object1的构造函数来传递包含object2的智能指针。
由于我希望在构造后能够访问object2的函数,我需要以某种方式引用它以供以后使用:

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

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

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

假设所有权是唯一的(因此没有shared_ptr),以便您的MasterClass和只有MasterClass拥有子对象的所有实例,您需要做的是使用unique_ptr并通过constl-value引用传递它们,以便您能够始终访问特定子对象的正确地址(因为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并不能真正确保被调用函数不会通过移动到自己的unique_ptr或诸如此类的微妙事情来获得所有权。

相关内容

  • 没有找到相关文章

最新更新