考虑以下课程。
class mapping_items
{
public:
mapping_items(){}
void add(const mapping_item* item) {
items_.push_back( item );
}
size_t count() const{
return items_.size();
}
const mapping_item& find(const std::string& pattern){
const mapping_item* item = // iterate vector and find item;
return *item;
}
private:
mapping_items(const mapping_items&); // not allowed
mapping_items& operator=(const mapping_items&); // not allowed
std::vector<const mapping_item*> items_;
};
C ++ FAQ说,
尽可能使用参考,和 必要的指针。
所以在上面的示例中,我应该返回const mapping_item&
还是const mapping_item*
?
我选择mapping_item&
的原因是因为总会有一个默认的返回值。我永远不会有空回报。因此,引用清楚地表明它不能有空值。这是正确的设计吗?
答案 0 :(得分:2)
存在问题 - 如果find()函数失败会发生什么?如果预计永远不会发生这种情况,那么你可以返回一个引用(如果它发生了则引发异常,尽管它不应该发生)。另一方面,如果它可能发生(例如在地址簿中查找名称),则应考虑返回指针,因为指针可以为NULL,表示查找失败。
答案 1 :(得分:1)
这对我来说似乎是一个合适的设计选择 - 就像C ++ FAQ状态一样 - 尽可能使用引用。 IMO,不必使用指针只是似乎使代码更难理解。
答案 2 :(得分:1)
是的,这是正确的设计。客户端可以依赖非空值。
在相关的说明中,其他一些类负责管理mapping_item的生命周期?
指针和所有权容易引起内存泄漏或更糟。您可能想要考虑是否确实需要存储指针,或者是否可以避免复制mapping_item,以避免内存泄漏。但是,如果需要管理子类的mapping_item,则必须使用指针。如果实例很大或需要共享,建议使用指针。
如果你真的需要指针,可以考虑使用boost :: shared_ptr&lt;&gt;而不是原始指针,无论是在您的类中还是作为参数类型,例如add()函数。
答案 3 :(得分:0)
有些人说,我同意,
如果值为
NULL
,则使用指针 和其他参考
至于你的例子,我可能会选择return const mapping_item;
,所以按值,以避免引用临时,并希望我的编译器优化复制。