我正在重新设计一个我最近编写的相当复杂的程序。该程序由各种相互依赖的对象组成。我现在想要实现的是改变其中一个对象并将其替换为相同类型但具有不同属性的对象(例如,在构造新对象期间分配)的功能。
实现此功能的正确方法是什么?
到目前为止我做了什么?
目前我正在使用一个包含一组包含不同对象的unique_ptr的“主类”。假设object1依赖于object2,所以在构造过程中我通过引用传递包含object2的智能指针到object1的构造函数。
由于我希望能够在构造之后访问object2的函数,我需要以某种方式引用它以供以后使用:
根据我的理解,我不能使用指向底层对象的原始指针,因为它指向某个内存地址,当旧对象被替换时,该地址可能会发生变化。 目前我正在尝试使用引用智能指针本身的引用,它应该永远不会改变它的地址,但应该始终知道object2的位置。
这是一个选择吗?因为现在我遇到的问题是我曾经有过指向object2中某些变量的指针(主要是为了更容易编写代码),但是我很确定我会再次遇到同样的地址问题。在这种情况下,我是否应该在第一个引用中使用对变量的引用 - 这是否会起作用?
我还可以使用引用智能指针的原始指针,但这感觉它不是正确的方法。不久前我开始使用C ++,我觉得我可能过度使用了指针,或者我没有正确使用智能指针,我不知道 - 所以任何帮助都会非常感激!
答案 0 :(得分:1)
您需要做什么,假设所有权是唯一的(因此没有shared_ptr
),以便您的MasterClass
和MasterClass
拥有子对象的所有实例,就是使用{ {1}}并通过unique_ptr
l-value引用传递它们,以便您始终能够访问特定子对象的正确地址(因为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());
}
}
的类更改托管对象,则可以使用非const
引用,但这会导致一些问题,因为非MasterClass
传递了非std::unique_ptr
const引用并不能确保被调用的函数不会通过移入自己的unique_ptr
或其他微妙的东西而获得所有权。