语境:
通常会出现需要聚合的情况:一个对象在不拥有另一个对象的情况下使用了另一个对象。也就是说,某些主模块将为其他主模块创建并共享一个对象。
但是,到目前为止,我还没有找到实现它的正确方法。
先前的研究:
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 Stroustrup谈C ++核心规则和准则,特别是从给出的链接开始的部分。在此方面,Herb Sutter的后续演讲也很有用,它介绍了一些用于执行这些规则的静态分析工具的想法。
我知道这是不是你要找的神奇的解决方案,但它的价值,这似乎是解决人们的方式更聪明,方式更经历了C ++比我想出了。老实说,这就是Bjarne Stroustrup最近大部分时间都花在这些规则和准则上的原因:C ++本身不存在针对此类问题的完美解决方案,但是由于某些限制,我们可以更加紧密地联系在一起。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句