所以,我有一个类,它存储一个指向对象的指针向量。我有一个方法,可以向对象添加对象。添加时,我知道我可以通过引用或指针传递,并阅读了每个的优点和缺点,但在这种情况下,我无法弄清楚哪一个更好,为什么。对于我可以弄清楚的一切,他们几乎是一样的(但我可能错了!)
这是(一个释义)传递指针/地址:
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);
}
我应该使用哪个?
答案 0 :(得分:5)
一点也不重要,所以在呼叫站点看起来更自然,或者与其他代码更加一致。
好的,我可以看到有利于每个人的观点,但我不能告诉你它们在你的情况下是否重要。
new
的结果)看起来很自然NULL
,这可能是也可能不正确和有用答案 1 :(得分:1)
无论哪个,取决于您的其他程序的上下文。
两者都可以正常工作,因此更多的问题是如何使代码更清晰。
答案 2 :(得分:1)
从技术上讲,两者都是相同的传球方式,并且同样有效。 但是,在设计层面,用户如何解释这些接口,承诺的合同存在差异。这也是自我描述界面的问题。
乍一看,by-pointer版本说:item 可能指向现有对象的指针,或者可能 nullptr
(可能是{{} 1}}测试指针并做出反应),而by-reference版本表明,项目必须引用现有对象(调用者必须保证,因此addItem
不必测试它。)
简单地说,选择语法也是明确无误地表达你的意图的问题。
答案 3 :(得分:0)
这是(你的)语法偏好的问题,因为这是不一种情况,其中引用提供了一些优于指针的好处,反之亦然。我建议你使用指针,这样对于那些正在阅读客户代码(使用房间类型)的人来说,你是通过引用传递项目而不是通过值传递的。