编程时,我经常遇到以下设计选择:用户创建一个对象并将其传递给另一个在第二阶段以某种方式处理的对象。
举个例子,你可以想象一个光线跟踪器。用户创建具有特定属性的球体并调用raytracer.addTraceable(sphere)
。现在,有三种方法我可以想到这样做。
在这种情况下,一般来说最好的设计选择是什么?除了我提到的那些(不包括智能指针)之外还有其他选择吗?
PS:在使用面向对象的方法时,我在普通的C中遇到了同样的问题。
答案 0 :(得分:6)
RAII的一致使用使这成为一个有争议的问题。使用诸如std::shared_ptr
之类的智能指针,该对象由指针的所有拥有,并在最后一个指针被销毁后被删除。
C并没有真正方便的方式来表达RAII习语。
答案 1 :(得分:2)
您似乎意识到智能指针可以为您解决问题,但是由于您没有解释的原因,您正在解雇它。 (也许是因为你的代码真的必须适用于C和C ++?)
如果sphere
对象由raytracer
对象管理,则逻辑上它取得对象的所有权。但是,您遗漏了一个适用于此应用程序的选择:
raytracer
的对象的属性,然后负责创建和销毁对象。然后raytracer
变成类似工厂的东西,属性对象类似于构建器。
答案 2 :(得分:1)
从设计的角度来看,这三种方式都是正确的,总有利弊: