在创建windows父对象类和子对话框类时,通常最好让子类成为父类的朋友来访问其私有数据,还是应该使用访问器函数?
答案 0 :(得分:3)
对朋友的需求很少 - 通常情况下,当你需要在一个类中重新实现一些深度行为而不重写它们以便它们都从单个基类继承或者不提供大量的asccessors时。
只有我需要的时候才能在ActiveX中重写基于openGL的渲染器 - 当我需要获取大量低级模型数据时,却无法(出于非技术原因)重新实现常见的ABC。
答案 1 :(得分:2)
我最近遇到过类似的情况,我希望将A类的一些私有成员变量暴露给B类。
我不想添加公共访问器函数,因为这会将这些成员公开给所有其他类。
我不想让B成为A的朋友,因为这会将A的所有私人成员暴露给B.
所以我为此专门制作了另一个类(A-to-B私有接口)。它是A的朋友,除了访问者功能之外什么都没有:
class A
{
int top_secret; // only A has access to it
int secret; // only A and B have access to it
friend struct AToBInterface;
};
struct AToBInterface
{
static int secret(const A& object) {return object.secret;}
};
class B
{
void DoSecretStuff(A& object)
{
int secret = AToBInterface::secret(object);
...
}
};
您可以调整语法(例如,如果您需要读写访问权限),这只是一个想法。我只在代码中的一个地方使用它,所以如果语法有点毛茸茸没问题。
答案 2 :(得分:0)
“friend”通常倾向于用于破解封装,因为它可以允许外部实体访问您的类的私有数据。你几乎从不想这样做 - 通过公共访问者(可以检查有效性)暴露“半私有”数据通常比将私人信息暴露给另一个类(它可以在你身上肆无忌惮)更好/更安全。
但是,有时候你会有一对/一组非常密切相关的类,将它们作为单独的类保留是有意义的,但是它们需要对真正不应该与整个世界共享的数据进行低级访问。这是“朋友”可以使用的地方 - 小心。
通常,尝试限制朋友的范围(例如朋友方法而不是朋友类)以最小化允许直接访问私人数据的区域。保持尽可能简单 - 请记住,另一个阅读代码的程序员可能会认为“私有”意味着数据是真正私密的,并且可能被朋友绊倒。此外,您使用的朋友越多,您的设计就越紧密,难以维护。它们很有用,但要确保每次使用都有充分的理由。