在现代C ++中实现聚合的正确方法是什么?

阿德里安市长

语境:

通常会出现需要聚合的情况:一个对象在不拥有另一个对象的情况下使用了另一个对象。也就是说,某些主模块将为其他主模块创建并共享一个对象。

但是,到目前为止,我还没有找到实现它的正确方法。

先前的研究:

1)类C指针:共享对象作为指针提供。问题在于,程序员必须正确管理创建,共享和删除的顺序,这些顺序可以轻松携带悬挂的指针。

int main()
{
    A a;
    B b(&a);
    return 0;
}

2)弱指针:使用共享/弱指针解决了指针悬空的问题。主要问题是:它避免使用堆栈对象。它还会在例外情况下中继,这些例外情况在最好的情况下是一个争论性的话题,而在最坏的情况下则是不可能的(内核/低级代码)。

int main()
{
    std::shared_ptr<A> a(new A());
    std::weak_ptr<A> wa = a; // optional, but required to show the weak_ptr use
    B b(wa);
}

3)共享指针:仅使用共享指针与(2)有相同的问题,但是另外A的所有权是未知的:这违反了一些设计准则。

4)对象参考:共享对对象的参考解决悬空问题,并且可能是最简单的解决方案。另一方面,它强制将聚合对象传递到构造函数中,避免了赋值运算符,并且通常会限制设计。

int main()
{
    A a;
    B( a );
}

5)永远不要汇总,仅作为参数传递。即使可能,这也会大大增加某些功能的参数数量。在我看来,这是过多的额外复杂性。

6)Singleton模式Singleton允许从多个模块访问单个对象。但是,这仅允许一个实例被共享,并且违反了多个设计准则。

问题:

在现代C ++中实现聚合的正确方法是什么?

理想的目标是:

  • 使代码易于维护,并避免错误。
  • 灵活地以不同方式使用它(例如堆栈/堆)
  • 没有太多的额外复杂性或晦涩的代码。
黛西·索菲亚·霍尔曼

正如许多评论者所指出的那样,没有一种解决方案可以解决您的问题。但是,考虑到以C ++设计模式为生的人们已经对这种事情进行了详尽的讨论。关于更好地处理悬空指针(包括评论者之一的建议)的一次伟大讨论template <class T> using non_owning_ptr<T> = T*,我建议Bjarne StroustrupC ++核心规则和准则,特别是从给出的链接开始的部分。在此方面,Herb Sutter的后续演讲也很有用,它介绍了一些用于执行这些规则的静态分析工具的想法。

我知道这是不是你要找的神奇的解决方案,但它的价值,这似乎是解决人们的方式更聪明,方式更经历了C ++比我想出了。老实说,这就是Bjarne Stroustrup最近大部分时间都花在这些规则和准则上​​的原因:C ++本身不存在针对此类问题的完美解决方案,但是由于某些限制,我们可以更加紧密地联系在一起。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在c ++ 11中,最现代的方法,最迭代向量的最“正确”方法是什么

来自分类Dev

在C ++中执行“ mkdir -p”的现代方法是什么?

来自分类Dev

在C中实现椭圆方程的正确方法是什么?

来自分类Dev

现代C ++中的动态数组

来自分类Dev

C++ - 实现 JS 的 setTimeout 的现代方法

来自分类Dev

接口声明中的C ++实现代码

来自分类Dev

C#中的现代线程方法

来自分类Dev

在现代C ++中重载算术运算符的“最佳”方法是什么?

来自分类Dev

在现代C ++中重载算术运算符的“最佳”方法是什么?

来自分类Dev

在C中实现线程屏障和屏障重置的正确方法是什么?

来自分类Dev

在C ++ 17中实现迭代器和const_iterator的正确方法是什么?

来自分类Dev

没有Boost的现代C ++中的bimap实现

来自分类Dev

为什么现代的C ++库不优先支持线程?

来自分类Dev

将常数双精度映射为整数的现代C ++方法

来自分类Dev

最好的现代C ++处理shared_ptrs的std :: array的方法?

来自分类Dev

现代C ++中类型擦除的分配器

来自分类Dev

现代c ++中的唯一指针

来自分类Dev

如何为现代C ++遍历JSON中的JSON

来自分类Dev

使用现代 C++ 从文件中读取 - 不存储数据

来自分类Dev

如何在现代 C++ 中管理连续的内存块?

来自分类Dev

在C ++中实现回调的最佳方法是什么

来自分类Dev

在C ++中实现分数类型的最佳方法是什么?

来自分类Dev

在C中实现函数重载的最佳方法是什么?

来自分类Dev

在C ++中调用构造函数的正确方法是什么?

来自分类Dev

如何在现代C ++中没有宏的情况下实现系统特定的功能

来自分类Dev

从GRPC c ++服务器实现返回“未找到”响应的正确方法是什么?

来自分类Dev

什么是构造和操作二维数组的最佳现代 C++ 方法

来自分类Dev

使用()或{}在现代C ++(C ++ 11及更高版本)中正确初始化变量?

来自分类Dev

实现代表“带有标题的列表”的类的pythonic方法是什么?

Related 相关文章

  1. 1

    在c ++ 11中,最现代的方法,最迭代向量的最“正确”方法是什么

  2. 2

    在C ++中执行“ mkdir -p”的现代方法是什么?

  3. 3

    在C中实现椭圆方程的正确方法是什么?

  4. 4

    现代C ++中的动态数组

  5. 5

    C++ - 实现 JS 的 setTimeout 的现代方法

  6. 6

    接口声明中的C ++实现代码

  7. 7

    C#中的现代线程方法

  8. 8

    在现代C ++中重载算术运算符的“最佳”方法是什么?

  9. 9

    在现代C ++中重载算术运算符的“最佳”方法是什么?

  10. 10

    在C中实现线程屏障和屏障重置的正确方法是什么?

  11. 11

    在C ++ 17中实现迭代器和const_iterator的正确方法是什么?

  12. 12

    没有Boost的现代C ++中的bimap实现

  13. 13

    为什么现代的C ++库不优先支持线程?

  14. 14

    将常数双精度映射为整数的现代C ++方法

  15. 15

    最好的现代C ++处理shared_ptrs的std :: array的方法?

  16. 16

    现代C ++中类型擦除的分配器

  17. 17

    现代c ++中的唯一指针

  18. 18

    如何为现代C ++遍历JSON中的JSON

  19. 19

    使用现代 C++ 从文件中读取 - 不存储数据

  20. 20

    如何在现代 C++ 中管理连续的内存块?

  21. 21

    在C ++中实现回调的最佳方法是什么

  22. 22

    在C ++中实现分数类型的最佳方法是什么?

  23. 23

    在C中实现函数重载的最佳方法是什么?

  24. 24

    在C ++中调用构造函数的正确方法是什么?

  25. 25

    如何在现代C ++中没有宏的情况下实现系统特定的功能

  26. 26

    从GRPC c ++服务器实现返回“未找到”响应的正确方法是什么?

  27. 27

    什么是构造和操作二维数组的最佳现代 C++ 方法

  28. 28

    使用()或{}在现代C ++(C ++ 11及更高版本)中正确初始化变量?

  29. 29

    实现代表“带有标题的列表”的类的pythonic方法是什么?

热门标签

归档