darling224 2022-03-17 11:18 采纳率: 50%
浏览 42
已结题

类A成员函数,做类B的友元函数,然后这个函数在类A内实现,就会报错,在类外实现就没有问题,问什么不能在类内实现?

类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的实现

  • 写回答

4条回答 默认 最新

  • 真相重于对错 2022-03-17 11:58
    关注

    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;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月25日
  • 已采纳回答 3月17日
  • 修改了问题 3月17日
  • 创建了问题 3月17日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效