说我有课:
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();
这是否是接近它的理想方式,旨在保持旧语法和类稳定性?我能想到的唯一方法就是将数据成员包装在一个小类中,但是对于你应用它的每个类来说,这似乎很多。