C++ 中的 protected总结(云风的blog)

class foo {
  int a;
public:
  int foobar(foo * f) {
    return this->a + f->a;
  }
};

在 foo::foobar 中可以访问 f 的私有成员变量 a。

所谓私有,是针对类的,而不是具体的对象。

class foo {
protected:
  int a;
};

class foobar : public foo {
public:
  int bar(foo * f) {
    return this->a + f->a;
  }
};

这次,在 foobar::bar 里,访问 this 的 a 成员允许,但 f 的 a 成员却被禁止了。

因为 foo::a 对 foobar 是 protected 的,foobar 的成员函数可以访问自己的 a ,但是对于 foo 指针,就禁止了。

想了一下,解决方案是。

class foo {
protected:
  int a;
  static int get_a(foo *self) {
    return self->a;
  }
};

class foobar : public foo {
public:
  int bar(foo * f) {
    return this->a + get_a(f);
  }
};

此文想说明的问题正在于那个坏味道的 static getter

private 数据成员,protected getter 并不解决问题:让非此家族系的地方都访问不到这个成员,而让本家族的都可以。

相对而言, public getter 与 public data member 差异就比较小了。

qaqz111:

正确的 OO 封装,应该是除了自身数据成员之外完全不涉及到另外一个 Object,即使是本类的另一个实例也不行。

举个明显点的例子,一个树结构连接父节点和子节点的操作,跟LZ文章里的代码有点类似,这明显是一种关系,两个独立的节点之间的关系。在设计 Object 的时候,有3种方案:第一种,this作为父节点,封装一个这样的方法:Node::Add( Node* child );第二种,this作为子节点,封装方法:Node::AttachTo( Node* parent );第三种,static Node::Attach( Node* parent, Node* child )。

在设计者以 OOP 思想对 Object 进行设计的时候通常会倾向于在第一二种方案里选择一种,但是第一二种其中的任何一种设计对另外一种来说都是“不公平”的,你能简单的说第一种好过第二种或者第二种好过第一种么?而且刚接触 OOP 的人很可能会因为选择两种方案的哪一种犯难:只实现第一种还是只实现第二种?还是两种全部加上?两种全部加上之后你就会发现代码可能会有重复,然后又有3种解决方案:一call二;二call一;一二call一个共同的static。最后提出一个static那不是就又绕到第三种方案去了么?












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值