使用C风格的结构访问维护封装

时间:2012-04-09 20:44:34

标签: c++ encapsulation const-cast

说我有课:

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();

这是否是接近它的理想方式,旨在保持旧语法和类稳定性?我能想到的唯一方法就是将数据成员包装在一个小类中,但是对于你应用它的每个类来说,这似乎很多。

0 个答案:

没有答案