我有以下课程:
class DataBuilder
{
public:
DataBuilder(Data& data): data_(data){}
//Fun modify data_, uses private methods
void Fun(std::string name, int id) //const ?
{
//calculate newInfo based on params (uses private methods)
auto& info = data_.GetInfo();
info = newInfo;
}
private:
//some private methods
Data& data_;
};
理论上有趣可以是 const ,但我想知道它是否正确(逻辑常量)?
Edit1 我添加了一个非常简化的Fun实现。 Edit2 数据有两个GetInfo重载:
Info& Data::GetInfo();
const Info& Data::GetInfo() const;
答案 0 :(得分:5)
const
表示“不修改对象”,这是通过将隐式this
视为指向const的指针来强制执行的。出于这个原因,通常会看到像
Data & getData();
Data const & getData() const;
这会保留调用上下文的const
,并允许在非const上下文中调用时修改Data
。
在你的情况下,你没有Info & Data::getInfo const;
(这可能是相当可疑的,const Data
从哪里得到非const Info
?{{1} }正在修改Fun
的{{1}}成员。
除了:
我会将作业写为data_
答案 1 :(得分:2)
Fun
正在操纵数据。因此 应该无法声明const
。您 能够做到这一点的事实显然,data.GetInfo
被声明为const
,但返回一个引用,通过该引用可以操纵它的内部状态。这是糟糕的编程。
所以不,这不正确。即使在理论上,Fun
也不应该const
,因为它不是const
。它正在操纵内部状态。它可能的事实是由于编码错误。修复它。 List[Nothing]
- 正确是半心半意的事情。你做到了,或者你没有。