将抽象基类作为成员处理时的所有权问题

Ownership issues when dealing with abstract base classes as members

本文关键字:所有权 问题 处理 成员 抽象 基类      更新时间:2023-10-16

当在构造函数中将类作为参数传递时,我最终在大多数情况下会传递指针。主要原因是我必须传递无法实例化的抽象类,并且由于引用不能为空,我真的别无选择......

这是一个例子:

// Abstract class A
class A { 
    virtual void foo() = 0;
};
class B : public A {
    void foo();
};
class C {
public:
    C(A* a) : _a(a) {};
private:
    A* _a;
};

在某些情况下,我希望C处理_a指向的A对象(删除时将其删除),在其他情况下,我希望C删除_a而不删除A对象。

拥有健全的编程方法的最佳实践是什么?

使用

shared_ptr 表示共享所有权,使用 unique_ptr 表示唯一所有权。 如果您确定C的生存期受A对象(或拥有A的另一个对象)的生存期限制,则可以使用引用或带有 nil 删除器的shared_ptr