防止同一个类的实例调用公共函数(C ++)

时间:2012-11-05 13:43:36

标签: c++

  

可能重复:
  Why do objects of the same class have access to each other’s private data?

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

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

如果我有SetPos公开或受保护,每个人都可以改变彼此的位置,如果SetPos()是私人的,人类甚至无法设置自己的位置(我需要这个,可能是一个弱的例子但我希望你理解。)

有人能提供解决方案吗?

感谢。

2 个答案:

答案 0 :(得分: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,并且必须由Human调用protected,即使只在其自身上,也需要public或{{ 1}}。

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

答案 1 :(得分:1)

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

也许你可以通过管理指针来限制访问?不要指向通常可用的对象,但总是通过某种类型的接口,通过数字或其他键识别您想要使用的对象?