为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错

why declaring an object of a class before defining it gives error in friend class but not in friend function

本文关键字:出错 友元 错误 函数 定义 对象 为什么 声明      更新时间:2023-10-16
class B;
class A {
private:
int numA;
public:
A(): numA(12) { }
// friend function declaration
friend int add(A, B);
};

这不会在朋友中声明 B 类的对象时给出任何错误 函数,但这给出了,,首先声明了 B 类

class Apple;
class B {
private:
int b;
public:
void showA(Apple d)
{
// Since B is friend of A, it can access
// private members of A
cout << "A::a=" ;
}
};
};

这给出了对象 D 不完整类型的错误,为什么会发生这种情况,尽管我们之前已经声明了类 Apple,

为什么第一个示例要编译?

在第一个示例中,您有一个class B的前向声明,后跟一个在其参数列表中使用它的 friend 函数的声明

class B;
class A {
...
friend int add(A, B);
};

这是允许的,因为尽管B不完整,但我们还没有定义add,只是宣布最终这样做的意图。

为什么第二个示例不编译?

在第二个例子中,我们有一个前向声明class Apple,后跟一个showA的定义

class Apple;
class B {
...
void showA(Apple d)
{
...
}
};

这一次,由于我们正在定义函数,编译器有义务为其生成代码。 但是由于Apple不完整,编译器无法知道,例如,在内存中保留多少空间来保存参数d。 因此,这是一个错误。

问题 何时可以使用前向声明?解释了不完整(前向声明(类型可以执行和不可以执行的操作。

在这里使用"朋友"无关紧要

friend关键字在这里基本上无关紧要。friend主要影响访问控制(在publicprivate的意义上(,但这不是这里的问题。

一个细节:friend也会影响范围界定。 由于friendadd不是class A的成员,而是指全局范围的成员,而没有实际引入一个(这很奇怪(。 但这不会改变不完整类型是否可以用作参数。