class 的成员函数作为另一个 class 的朋友

Member function of a class as friend to another class

在这段代码中,我做了 class 的最大函数 class A.I 的朋友也做了 class B.But 的前向声明出错了。

#include<iostream>

using namespace std;

class B;

class A
{
   int a;
   public:

   void get()
   {
      cin>>a;
   }

   friend void B :: max(A , B);
};

class B
{
   int b;
   public:

   void get()
   {
      cin>>b;
   }

   void max(A x, B y)
   {
      if (x.a > y.b)
         cout<< " x is greater";
      else cout<<"y is greater";
   }
};

int main()
{
   A x;
   B y,c;
   x.get();
   y.get();
   c.max(x,y);
}

您不能使用:

friend void B :: max(A , B);

没有B的完整定义。

您需要重新考虑您的策略,以便您可以在不使用 friend 声明或将 B 的定义移到 A 的定义之前实现功能。

A​​s R Sahu 已经回答:

您不能使用:

friend void B :: max(A , B);

没有B的完整定义

这是实现目标的方式:

#include<iostream>
using namespace std;

class A;

class B{
    int b = 2;

public: 
    void max(A x, B y);
};

class A{
    int a = 1;
public:
    friend void B :: max(A , B);
};

void B::max(A x, B y){
    if (x.a > y.b)
        cout<< " x is greater";
    else 
        cout<<"y is greater";
}

int main(){
A x;
B y,c;
c.max(x,y);
}

B 在您将 B::max 声明为友元方法时不完整。因此,编译器不知道是否有这样的方法。

这意味着您需要

  1. 重新排序 classes,以便 A 知道 B 有一个方法 B::max
  2. 在 class 定义之外实现方法 B::max,当两个 class 都完成时,因为您访问了内部变量。

通过 const 引用传递参数也是一个好主意。使用 const 强调您没有修改它们。通过引用传递以避免不必要的复制。

所以,考虑到这一点:

class A;

class B{
    int b;
public: 
    void get(){
        cin>>b;
    }
    void max(const A& x, const B& y);
};

class A{
    int a;
public:
    void get(){
        cin>>a;
    }
    friend void B :: max(const A& , const B&);
};

void B::max(const A& x, const B& y) {
    if (x.a > y.b)
       cout<< " x is greater";
    else
        cout<<"y is greater";
}