5

可能重复:
为什么同一类的对象可以访问彼此的私有数据?

尝试保持封装时我从未理解过的东西:

假设我有一个名为 的类GameObject和一个名为 的派生类HumanGameObject有一个私有变量position。我有多个实例Human,我希望每个人都能够根据需要调用SetPos()并设置它的位置。然而,我不希望一个人有能力设置另一个人的位置。这是我的问题。

如果我有SetPospublic 或 protected,每个人都可以改变彼此的位置,如果SetPos()是私有的,一个人甚至不能设置自己的位置(我需要这个,可能是一个薄弱的例子,但我希望你能理解)。

任何人都可以提供解决方案吗?

谢谢。

4

2 回答 2

1

如果 SetPos() 是私有的,人类甚至不能设置自己的位置

实际上,它可以,如果SetPos定义在Human. 一个private方法只能从类内部调用,但它不保护同一个类的实例彼此之间:

class Human {
  private:
    void set_pos(int i) { std::cout << "moving to " << i << std::endl; }
  public:
    void set_pos_on_other(Human &other, int i) const { other.set_pos(i); }
};

int main()
{
    Human alice, bob;
    bob.set_pos_on_other(alice, 10);
}

如果SetPos定义在GameObject并且必须由 a 调用Human,即使仅在其自身上,也必须是protectedor public

要解决对象调用彼此private方法的问题,您只需要仔细编程并坚持您的不变量。C++ 没有为此提供特殊语法。每当一个Human方法被传递一个引用或指向另一个的指针时Human,它就可以调用它想要Human的所有方法。private

于 2012-11-05T13:49:00.817 回答
1

公共和私有的封装旨在解决一个不同的问题,即通过将类与其他类隔离来使类的编码更容易。不隔离单个对象。

也许您可以通过管理指针来限制访问?不要使指向对象的指针普遍可用,而是始终通过某种接口,通过数字或其他键标识您要使用的对象?

于 2012-11-05T14:06:27.713 回答