给定的是一个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
,表示操作无效。然而,这不是说调用者通常会通过请求不存在的东西而做错了吗?
set()
:
void set( key, value )
bool set( key, value )
void
版本忽略无效的键或值。再说一次:如果出现错误该怎么办?
bool
版本在成功时返回true
,在密钥和/或值无效时返回false
。此处与get()
相同:用户在指定无效键和/或值时可能出错了。
您是否宁愿让应用程序以某种方式崩溃以指示用户使用错误或依赖用户检查结果返回值?
答案 0 :(得分:1)
对于getter,我也会考虑按值返回。返回指针(yuk)或参考限制选项,以便在以后重新实现班级的内部,除非您也乐意进行界面更改。
作为一个人为的例子,请考虑:
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; }
至于制定者,嗯,你真的要决定在失败时做些什么。