クラスがあるとします:
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
そもそもクラスに入れることの半分を悪用したくない場合はどうなりますか? 1つの障害のために(一見)メンバーに直接アクセスすることを好む人々に対して、ある程度の余裕を持たせないことを余儀なくされていますか、それとも構文(読み取り用)とカプセル化の両方を実際に許可するためのトリックがありますか?
その方法を使用せずに(今回は一貫して)私が考えることができる構文を維持する最良の方法は次のとおりです。
private:
int _bar;
public:
int bar() { return _bar; }
void bar (const int data) { _bar = data; }
...
foo.bar (5);
cout << foo.bar();
これは、代わりに古い構文とクラスの安定性を維持することを意図してアプローチする理想的な方法でしょうか? 構文を正確に維持するために私が考えることができる唯一の方法は、データ メンバーを小さなクラスにラップすることですが、これを適用するクラスごとに多くの作業のように思えます。