【发布时间】:2020-06-15 11:10:41
【问题描述】:
考虑以下
class Base;
class A {
int x;
friend class Base;
};
class Base {
protected:
A a_obj;
public:
Base(){
a_obj.x; // works
}
};
class Derived : public Base {
public:
Derived(){
a_obj.x; // not accessible
}
};
我可以公开 x 的 getter 和 setter,或者公开对象,但这不是可取的。假设有一堆派生类,在class A 中添加friend class Derived 会使代码过于冗长。有没有办法说“A 是 Base 类的朋友,都是孩子”
【问题讨论】:
-
不,没有办法写出这样的朋友声明。一个朋友明确地只针对提到的类。另一方面,我认为您需要重新考虑您的设计,而不是使用直接的名词到类的翻译,而是考虑所需对象的行为。因此,例如,您无需尝试直接获取
x的值,而是要求a_obj对象执行操作并从该操作中获取结果。 -
您的设计需要修复。不应授予类访问从一个基派生的所有类型的成员。这些成员应该是基地的(受保护的)成员
-
@Someprogrammerdude 这就是我会做的。在这个例子中,“重新考虑设计”似乎很明显,但这只是我正在研究的一个提炼版本。在我的示例中,按照您的建议制作 getter 和 setter 是不明智的。有没有一种不冗长的替代友谊可以允许这样做?
-
不,我不是指简单的 getter 或 setter,这就像使用
friend或将成员全部设为public。相反,我的意思是调用a_obj的成员函数来执行动作,进行一些计算或其他类似的事情,然后返回结果。不要将类视为简单的容器或成员分组,应将它们视为某种行为。例如,Dog类具有bark和eat(以及其他)行为,但您无权访问狗的内部“成员”(例如它有多满)。 -
@Someprogrammerdude 在我的项目中,一个更好的比喻是满屋子的外科医生(派生类)在为无意识的病人(基类)工作。这真的没有多大意义(为什么它还是派生出来的?)。我现在意识到最好将我的类变成一个数据结构。我希望有一个快速的语法修复,而不是我的程序的完全重组。哦,好吧,你生活和学习
标签: c++ class inheritance