想象一下,我们有一个班级
class cFoo {};
另一个带有cFoo
对象向量的对象,如下所示:
class cContainer
{
public:
const cFoo& getFoo(std::size_t index) const;
private:
std::vector<cFoo> fooList_;
}
const fCoo& cContainer::getfoo(std::size_t index) const
{
if(index < fooList_.size())
return fooList_[index];
else
??????????
};
所以我的问题是“在这种情况下最佳做法是什么?”。这是在其他部分代替????之后放的东西。此问题对于返回引用的任何成员函数(无论是否为const)都有效。当我们没有任何东西可以返回时,应该返回什么?
显然返回一个本地临时变量是不可能的。我想到的另一个解决方案是在cFoo()
类定义/实现期间返回最可能定义和初始化的cFoo
静态实例。
当然,在这种情况下我们可以避免返回引用,但它可能是性能差的选择(特别是如果我们缺少像移动运算符这样的好东西)。
答案 0 :(得分:10)
在这种情况下STL的作用是抛出异常。
例如,您可以查看std::vector::at
成员函数:
http://en.cppreference.com/w/cpp/container/vector/at
如果您要求超出范围的内容
,则会引发std::out_of_range异常另一种选择是在此上下文中返回指针或其更具语义明确的等价物,optional reference boost::optional<fCoo&>
。
如果&#34;超出范围&#34;我会建议这样做。案件不是那么特殊,应该不时发生。
最后,如果你认为这种情况永远不会发生,除非它是一个开发者错误,你应该使用assertion。
答案 1 :(得分:4)
如果函数没有返回是正常的,则不应该返回引用。返回指针没有错:
const fCoo* cContainer::getfoo(std::size_t index) const
{
if(index < fooList_.size())
return fooList_[index];
else
return nullptr;
};
如果没有返回任何东西,则表示该函数有例外,那么它应该抛出异常:
const fCoo* cContainer::getfoo(std::size_t index) const
{
if(index < fooList_.size())
return fooList_[index];
else
throw std::invalid_argument("out of range");
};