给定是一个c++类,它保存内部数据,这些数据将被公开给外部,并且可以被修改。
class Container {
public:
... get( int key ) const;
... set( int key, int value );
private:
std::vector<int> m_values;
};
问题是get()
和set()
最好得到什么返回类型。对于get()
:
-
const int& get( key )
,参照const值 -
const int* get( key )
,指针指向const值
使用引用时,如果给定的键不存在于容器中,则必须发生某些操作。例外吗?或者只是访问m_values
并让它抛出?依赖 assert
s ?
指针返回类型可以返回nullptr
,表示操作无效。然而,这是否意味着调用者通过请求不存在的东西而做了一些错误的事情?
For set()
:
-
void set( key, value )
-
bool set( key, value )
void
版本忽略无效的键或值。再问一次:如果出现错误该怎么办?
bool
版本成功时返回true
,键和/或值无效时返回false
。这里也与get()
相同:用户可能在指定无效的键和/或值时做了错误的操作。
您是宁愿让应用程序以某种方式崩溃,以表明用户使用错误,还是依赖于用户检查结果返回值?
对于getter,我也会考虑按值返回。返回指针(呸)或引用限制了以后重新实现类内部的选项,除非您也愿意更改接口。
作为一个人为的例子,考虑:
class Person
{
public:
// Returns height in metres
const int &getHeight() const { return height; }
private:
int height; // Height in metres
};
现在在以后的日期,如果我们决定改变内部以毫米为单位存储高度会怎么样?我们不能这样做:
const int &getHeight() const { return height / 1000; }
至于setter,那么,失败时如何处理完全取决于你自己。