2013-10-09 60 views
2

我想知道这是什么get函数应该返回时的参数不符合If条件的无效参数传递时函数应该返回什么?

template <class Object> 
    const Object& SparseMat<Object>::get(int c, int r) //const 
    { 
     if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity)) 
     { 
      return mObjects[c][r]; 
     } 
     //what should I return here? 
    } 
+0

它应该抛出异常 - 相关[问题](http://stackoverflow.com/q/13416488/952747)。 – deepmax

+0

你应该抛出。 – 0x499602D2

+0

我该怎么做? – user2175394

回答

11

您应该抛出一个异常:

#include <stdexcept> 

throw std::out_of_range("Indexes are out of range"); 
+0

为什么这会降低投票率?这没有错。 –

+0

@JohnDibling世界是残酷的。 :( – 0x499602D2

4

你确实有多种选择,特别是如果你愿意改变签名。

最有可能的,要发出错误信号,以及异常是非常有趣的位置:

template <class Object> 
const Object& SparseMat<Object>::get(int c, int r) const 
{ 
    if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity)) 
    { 
     return mObjects[c][r]; 
    } 
    throw UnknownCoordinates(c, r, cCapacity, rCapacity); 
} 

或者更改签名,您可以包括无效的概念:

template <class Object> 
Object const* SparseMat<Object>::get(int c, int r) const 
{ 
    if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity)) 
    { 
     return &mObjects[c][r]; 
    } 
    return nullptr; 
} 

哪可以使用boost::optional作出明确规定:

template <class Object> 
boost::optional<Object const&> SparseMat<Object>::get(int c, int r) const 
{ 
    if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity)) 
    { 
     return mObjects[c][r]; 
    } 
    return boost::none; 
} 

,或在不改变签名,你可能希望使用空对象,但这几乎不是最好的选择(它将你限制为嵌入无效概念的对象,并且这样的对象更好地被重构为不具有无效概念,而是依赖于boost::optional<Object>

template <class Object> 
const Object& SparseMat<Object>::get(int c, int r) const 
{ 
    if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity)) 
    { 
     return mObjects[c][r]; 
    } 
    return null; // where null is "static Object const null;" for example. 
} 
0

完全取决于你决定它应该返回什么以及它是否应该返回。也许而不是返回它应该中止(“崩溃”)或引发异常?正如已经提出的其他答案,在这种情况下抛出异常可能是嵌套方法。

但是,如果你真的坚持返回东西响应错误输入,一个选择,你有这样的情况下,将是一个预先定义的“伪” /“卫报” Object类型的对象,特别是存在用于处理这种情况。

template <class Object> 
class SparseMat 
{ 
    ... 
    static Object error_object; 
}; 


template <class Object> 
const Object& SparseMat<Object>::get(int c, int r) //const 
{ 
    if((c >= 0)&&(c <= cCapacity)&&(r >= 0)&&(r <= rCapacity)) 
    { 
     return mObjects[c][r]; 
    } 

    return error_object; 
} 

根据设计,你可能要做出error_object容易被调用代码识别。或者你可以设计这个“监护人”对象,这样调用代码就可以正常工作,甚至不会意识到返回的对象是一个“虚拟”。再次,这取决于你自己决定。

相关问题