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

时间:2015-08-23 19:28:24

标签: c++ c++11 visual-c++ forward-declaration friend-function

在这段代码中,我已经制作了A类B级朋友的max函数。我也做了B类的前向声明。但是它给出了错误。

#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);
}

3 个答案:

答案 0 :(得分:2)

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);
}

答案 1 :(得分:2)

在您将B声明为朋友方法时,

B::max不完整。因此,编译器不知道是否存在这样的方法。

这意味着您需要

  1. 重新排序类,以便A知道B有方法B::max
  2. 当两个类都完成时,在类定义之外实现方法B::max,因为您访问内部变量。
  3. 通过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";
    }
    

答案 2 :(得分:1)

你不能使用:

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

没有B的完整定义。

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