假设我有一堂课:
class Foo
{
int _bar;
public:
Foo (const int); //sets bar as well
bool setBar (const int);
int getBar();
const int &bar;
};
这将允许 C 和 C++ 方法获取数据,但在设置时仍然验证有效数据。它可以按如下方式使用:
int main()
{
Foo foo (10);
cout << foo.getBar(); //OK, prints 10
foo.bar = 5; //error: bar is const
foo._bar = 5; //error: _bar is private, use bar instead
foo.setBar (6); //OK, foo._bar is now 6
cout << foo.bar; //OK, prints 6
}
然而,一切都不是很好。这也允许一个特定的肮脏把戏:
Foo foo (1000);
const_cast<int &> (foo.bar) = 5; //OK, bar's const is casted away
cout << foo.bar; //OK, prints 5
如果我不希望人们首先滥用将其放入课堂的一半意义,会发生什么?我是否只是被迫不允许因为一个错误而对那些更喜欢(看似)直接访问成员的人留有余地,还是有一些技巧可以实际允许语法(用于阅读)和封装?
在不使用该方法的情况下保留我能想到的语法(这次保持一致)的最佳方法是:
private:
int _bar;
public:
int bar() { return _bar; }
void bar (const int data) { _bar = data; }
...
foo.bar (5);
cout << foo.bar();
这是否是为了保持旧语法和类稳定性而接近它的理想方式?我能想到的准确维护语法的唯一方法是将数据成员包装在一个小类中,但是对于您要应用它的每个类来说,这似乎需要做很多工作。