可能重复:
Why do objects of the same class have access to each other’s private data?
我试图保持封装时从未理解的东西:
假设我有一个名为GameObject
的类,以及一个名为Human
的派生类。 GameObject
有一个私有变量position
。我有Human
的多个实例,我希望每个人都可以调用SetPos()
并根据需要设置它的位置。然而,我并不希望一个人有能力建立另一个人的位置。这是我的问题。
如果我有SetPos
公开或受保护,每个人都可以改变彼此的位置,如果SetPos()
是私人的,人类甚至无法设置自己的位置(我需要这个,可能是一个弱的例子但我希望你理解。)
有人能提供解决方案吗?
感谢。
答案 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)
公共和私有的封装旨在解决一个不同的问题,即通过将类与其他类隔离来更容易编写类。不隔离单个物体。
也许你可以通过管理指针来限制访问?不要指向通常可用的对象,但总是通过某种类型的接口,通过数字或其他键识别您想要使用的对象?