为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
why declaring an object of a class before defining it gives error in friend class but not in friend function
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
主要影响访问控制(在public
和private
的意义上(,但这不是这里的问题。
一个细节:friend
也会影响范围界定。 由于friend
,add
不是class A
的成员,而是指全局范围的成员,而没有实际引入一个(这很奇怪(。 但这不会改变不完整类型是否可以用作参数。
相关文章:
- C++模板来检查友元函数的存在
- 模板类无法识别友元运算符
- 如何使用单独文件中的派生类访问友元函数对象
- 模板化的类和友元函数
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- 如何在嵌套类中正确使用友元声明?
- 友元函数无法访问私有数据成员 (c++)
- 继承和友元函数,从基类访问受保护的成员
- 将子类方法声明为基类的友元
- 如何在友元函数中使用静态成员而不添加前缀 [类名]::
- 在将函数声明为友元时,尖括号的含义是什么?
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- 友元方法作为常量
- C++ 友元函数和私有构造函数
- 使第二个类的构造函数成为第一个类中的友元函数
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 尝试重载模板类友元<<运算符时出错
- 尝试重载运算符并使用友元函数时出错<<
- MSVC 编译器错误导致迭代器和友元函数出错