保护成员变量是一种好习惯吗?

nak*_*iya 10 c++

问这个问题,因为我觉得稍后在派生类中需要我的基础的成员变量.是否有保护它们的缺点?

编辑:编辑以更好地表明我的意图.

编辑:@sbi:这也错了吗?

此类将用于在其他类中进行错误记录和检索.从它衍生或使用它的对象是否更好 - 我不知道.但我认为getter和setter方法就是这个类的全部内容.

class ErrorLogger
{
   public:
      //Making this function virtual is optional
      virtual void SetError(const char*, ...);
      const char* GetError() const;
   protected:
      char* z_ErrorBuf;
};
Run Code Online (Sandbox Code Playgroud)

sbi*_*sbi 22

封装是OO的主要特征之一.在类中封装数据意味着类的用户不能破坏类的数据的不变量,因为类的状态只能通过其成员函数进行操作.

如果允许派生类访问其基类的数据,那么派生类需要注意不要使基类的数据的不变量无效.这会将封装抛出窗口,这是错误的.(所以做吸气剂和制定者,BTW.)

protected多年来,我发现自己的使用越来越少,即使对于会员职能也是如此.如果一个类完全实现了一个简单的概念,那么它的所有状态都应该可以通过它的公共接口来操作.如果派生类需要"后门"潜入,那么我通常会质疑我的设计.(这并不是说我从不使用protected.我只是发现我越来越少需要它.)

  • @Robert:通过getter/setter公开成员变量使得代码比公开公开它们要脆弱0.01%.多么成就!再次,去阅读我链接的文件.Conrad Weisert对此的解释比以往任何时候都好. (3认同)
  • 另外一点:添加10行代码,其中零就足够了也会使代码更加脆弱. (3认同)
  • @SoMoS:请查看有关setter和getter的链接文档.他们是可憎的. (2认同)
  • @Robert Gowland:我明白你在说什么.这就是所有书籍和教授所说的,这就是我多年来所相信和争论的.但是在过去的20年中,我逐渐并且不情愿地得出结论,这是一个很好的,显然是逻辑的理论,但在现实世界中,它最终是无稽之谈.相反,我发现即使在"对象"中也有公共成员的位置.我描述的时候遇到麻烦的时候一直都是因为我搞砸了我的班级设计.不是因为酒吧成员有问题 (2认同)