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
的定义之前实现功能。
As 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
声明为友元方法时不完整。因此,编译器不知道是否有这样的方法。
这意味着您需要
- 重新排序 classes,以便
A
知道 B
有一个方法 B::max
和
- 在 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";
}
在这段代码中,我做了 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
的定义之前实现功能。
As 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
声明为友元方法时不完整。因此,编译器不知道是否有这样的方法。
这意味着您需要
- 重新排序 classes,以便
A
知道B
有一个方法B::max
和 - 在 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";
}