【问题标题】:C++ several instances (but not all) of a class sharing a vectorC++ 一个类的多个实例(但不是全部)共享一个向量
【发布时间】:2022-12-05 18:37:24
【问题描述】:

我想要一个类 C,这样 C 的实例将 std::vector<int> 作为私有成员。现在 C 的许多实例(但不是全部)将共享该向量,并且为每个实例保留一个副本是我想要避免的。

例如,如果这个向量是一个整数,我可以为 C 创建一个模板类,并像这样:

template <int N>
class C {
 // something
};

如果我希望所有实例共享该向量而不是某些实例,那么我会将变量声明为 static

class C {
    static std::vector<int> _vec;

我正在寻找的是中间的东西。例如,我可以将 shared_ptr 保留为私有非静态成员,如

class C {
     std::shared_ptr<std::vector<int>> _vec;
}

这将照顾对象的生命周期,维护共享所有权的一些开销以及每个实例的额外指针。我可以保留一个引用,让实例的创建者处理生命周期,但避免 shared_ptr 的开销。这个设计问题有更好的方法吗?

【问题讨论】:

  • 如果你把它做成一个模板,那么它就不是同一个类的不同实例,但是C&lt;1&gt;C&lt;2&gt; 是不同的类。你实际上会让一个类的所有实例“共享”同一个整数。但是,int 无法修改,所以我看不出它与其他替代方案有何可比性。无论如何,细节/背景/要求太少,无法说明什么是“更好”的设计

标签: c++ smart-pointers


【解决方案1】:

…这样 C 的实例将 std::vector 作为私有成员。现在 C 的许多实例(但不是全部)将共享该向量

所以,这是自相矛盾的。您不能持有一个实例并共享该实例。

这是指针的经典用例;更具体地说,a 的经典用例共享指针,正如您已经注意到的那样。

我可以保留一个引用,让实例的创建者来处理生命周期,

/me sounds the access-after-destruction alarm
你很快就会发现那是行不通的。生命周期并不像你想象的那样,而是在拥有对象的生命周期结束时结束。所以,这打破了。

参考文献中没有神奇的使用跟踪;你需要一些东西来跟踪你的个人vector是否仍然持有某些东西。该跟踪正是 shared_ptr 产生的“开销”。没有办法解决它。

因此,私人 shared_ptr 是正确的方法:

class C {
  private:
    std::shared_ptr<std::vector<int>> _vec;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多