类A成员函数,做类B的友元函数,然后这个函数在类A内实现,就会报错,在类外实现就没有问题,问什么不能在类内实现?
报错信息:
invalid use of incomplete type
源代码
#include
using namespace std;
class B;
class A;
class B
{
int num;
public:
B(int n = 0) : num(n) {} // 构造函数
friend void A::sum_2(B &b); // 友元函数
A::sum_2
};
class A
{
int num;
public:
A(int n = 0): num(n) {} // 构造函数
void sum_2(B &b) // 成员函数 sum_2
{
int sum = num + b.num; // 访问了参数对象的私有变量
cout << num << " + " << b.num << " = "
<< sum << endl;
}
};
int main()
{
A a(1);
B b;
a.sum_2(b); // 调用a的成员函数
system("PAUSE");
return 0;
}
把class A B都提前声明
这个错误代码会报错找不到classA的实现
如果我修改,把class A先定义,会报错找不到classB的实现
c/c++使用任何东西之前必须被定义。
你把A里面的函数定义为B的友元函数,则B之前必须要知道A全部,而类的前置声明做不到这一点。所以你要把A 声明提到B之前,而在sum2函数里要访问B,则需要把sum2函数定义在A之外B之后。
代码如下:
#include <iostream>
using namespace std;
class B;
class A;
class A
{
int num;
public:
A(int n = 0) : num(n) {} // 构造函数
void sum_2(B& b);
};
class B
{
int num;
public:
B(int n = 0) : num(n) {} // 构造函数
friend void A::sum_2(B& b); // 友元函数
};
void A::sum_2(B& b) // 成员函数 sum_2
{
int sum = num + b.num; // 访问了参数对象的私有变量
cout << num << " + " << b.num << " = "
<< sum << endl;
}
int main()
{
A a(1);
B b;
a.sum_2(b); // 调用a的成员函数
system("PAUSE");
return 0;
}
类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员。
在类A内部实现的时候,B类只是声明了,但是还没有创建,无法找到类B的方法。
友元函数必须在类内部声明,在类外部实现。
可以看看下面的文章:
A::sum_2===这行是干啥呢
using namespace std;你这里使用了存储空间导致调用a时是全局调用没找到该存储空间的a,去掉存储空间试试看