所有人,

我最近公布这个 的问题 在达尔的设计。从这似乎是通过一个参照对象成一个功能,该功能再填充,目的,将是一个良好的界面用C++数据存取层,例如

  bool DAL::loadCar(int id, Car& car) {} 

我现在想知道,如果使用基准来提升::情况会更好,例如

  bool DAL::loadCar(int id, boost::shared_ptr<Car> &car)

任何想法?没有一个提供优于其他的?

会有什么影响施加const正确性,这两个电话吗?

在此先感谢。

有帮助吗?

解决方案

作为 履行机构 说,"这取决于什么样的功能。"

然而,我认为最重要的方面的上述不是是否NULL是允许的,或者没有,但是否能存储指的对象供以后使用。如果功能只是填补的一些数据然后我会使用的参考以下原因:

  • 的功能仍然可以使用由客户不使用的情况,用于堆叠的对象,等等。
  • 使用的功能与的情况仍然是微不足道的-情况有取消引用的操作员,返回一个参考
  • 通过空是不可能的
  • 小打字
  • 我不喜欢使用"东西"时,我没有

如果功能需要存储指针,供以后使用或预期的功能可能会改变这样一种方式,将需要储存一指针,然后使用情况.

其他提示

这取决于功能做什么。

在一般情况下,采用指针的函数表示呼叫者会调用这个函数,即使他们没有一个对象传递给它 - 他们总是可以通过NULL。如果符合功能的规格,然后用(智能)指针。顺便提及的引用而不是复制它们计数智能指针是一个优化(而不是过早的一个,我要补充的),因为它避免了不必要地增加和减少引用计数,它可以在MT的环境,是一个明显的性能损失。

一个函数采取非const引用作为参数预计要传递一个有效的对象,它可能会改变。主叫方无法(合法)调用该函数,除非他们有一个有效的对象,他们不会调用它,除非他们愿意具备的功能改变对象的状态。如果能更好地满足功能的规格,使用参考。

如果您必须得到有效的对象(即你不希望调用者传递NULL),然后通过各种手段,不使用boost :: shared_ptr的。你的第二个例子传递一个“智能指针”的参考....忽略的细节,这是一个“指针指向汽车”。因为它的参考,shared_ptr的对象不能为NULL ....但它并不意味着它不能有一个NULL值(即指向“空”对象)。

我完全不明白你为什么会认为到智能指针的引用将是“更好” - 它的调用函数使用智能指针已

至于“常量”的含义......你的意思是这样

bool DAL::loadCar(int id, const Car& car) {}

? 如果是的话,那将是适得其反,你传达给编译器的事实,“车”不会改变(但想必你希望它改变!)。

或者你的意思是让功能“常量”,像

class DAL{
   bool loadCar(int id, Car& car) const;
}

在后一种情况下,你comunicate到方法“loadCar”不修改DAL对象编译器/ API用户。这是一个好主意,这样做,如果这是真的 - 不仅在于它使一些编译器优化,但它通常是在“合同”,特别是如果指定(函数签名),该函数不作任何修改DAL,是好事你做这个隐含的假设,在你的代码(这样您确保这保持为真,并在未来没有人会修改的方式,将改变“DAL”对象“loadCar”功能)

在第一种情况下,你简单地传递一个汽车和带信息“填充”。例如,您可以创建一个“默认”的汽车,然后填充它。我看到在这一个不便之处:它不是很OO有两类汽车的:一个可怜的,默认情况下,没用,“空”的车,和一个真正填补了汽车,它来自功能之后。在我看来,汽车是一辆车,所以它应该是一个有效的轿车(一个我可以从一个位置驱动到B,例如,一个,我可以加速,刹车,启动,停止)。之前和你的函数后

我通常与传统的指针工作,而不是提高(没有问题,顺便),所以我真的不能对后者替代评论。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top