3

所以,我有一个类,它存储一个指向对象的指针向量。我有一个将对象添加到向量的方法。添加时,我知道我可以通过引用或指针传递,并且已经阅读了每种方法的优缺点,但在这种情况下,我无法弄清楚哪个更好以及为什么。据我所知,它们几乎相同(但我可能错了!)

这是通过指针/地址传递的(释义):

hpp:
class Room {
    vector<Item*> items;
public:
    void addItem(Item*);
};

cpp:
void Room :: addItem(Item* item) {
    items.push_back(item);
}

...并通过引用传递:

hpp:
class Room {
    vector<Item*> items;
public:
    void addItem(Item &);
};

cpp:
void Room :: addItem(Item &item) {
    items.push_back(&item);
}

我应该使用哪个?

4

4 回答 4

5

这一点都没有关系,所以在调用站点上做任何看起来更自然的事情,或者与其余代码更一致。

好的,我可以看到有利于每个人的观点,但我不能告诉你它们是否对你的情况很重要。

  • 通过指针传递更准确地反映了您如何使用参数(尽管我不知道这是有用的语义信息还是实现细节)
    • 传递指针(或new直接的结果)的调用站点看起来很自然
    • 一个调用站点会做一些愚蠢的事情,比如传递一个自动变量的地址
  • 通过引用传递表明该论点不应该是正确和有用的NULL,也可能不正确和有用
于 2012-07-11T23:03:51.287 回答
1

无论如何,取决于您的程序的其余部分的上下文。

两者都可以正常工作,因此更多的是哪个会使代码更清晰的问题。

于 2012-07-11T23:00:52.367 回答
1

从技术上讲,两者都是等效的传球方式,并且效果同样好。然而,在设计层面,关于用户如何解释这些接口、承诺什么合同等方面存在差异。这也是自描述界面的问题。

乍一看,按指针版本说:项目可能是指向现有对象的指针,也可能是 nullptr(可能addItem会测试指针并做出反应),而按引用版本表明,项目必须引用现有对象(调用者必须保证,所以addItem不必测试它)。

简而言之,选择语法也是清晰明确地表达您的意图的问题。

于 2012-07-11T23:11:58.450 回答
0

这是(您的)语法偏好的问题,因为这不是引用比指针提供一些好处的情况,反之亦然。我建议您使用指针,以便阅读客户端代码(使用房间类型)的人立即清楚您是通过引用而不是值传递项目。

于 2012-07-11T23:03:43.733 回答