问题描述
我在这里更改了代码 所有变量都必须保持私有,并且必须使用朋友功能。 这里有A和B两个类,我应该接受5个数字(void enter())。函数average是能够访问所有变量并给出平均值。 我知道目前该行
obj2.average(a,b,c,d,e);
将给出错误,因为变量不可访问 所以我的问题是,如何在最后一行传递变量?
#include<iostream.h>
#include<conio.h>
class A
{
int a;
int b;
public:
friend class B;
int enter1()
{
cout<<"enter the value of a and b"<<endl;
cin>>a>>b;
return(a,b);
}
};
class B
{
int c;
int d;
int e;
public:
void average(int a,int b,int c,int d,int e)
{
float avg;
avg=((a+b+c+d+e)/5);
cout<<"average is "<<avg<<endl;
}
int enter()
{
cout<<"enter the value of c,e"<<endl;
cin>>c>>d>>e;
return(c,e);
}
};
void main()
{
A obj1;
B obj2;
obj1.enter1();
obj2.enter();
obj2.average(obj1.a,obj1.b,obj2.c,obj2.d,obj2.e);
}
解决方法
这里有A和B两个类,我应该接受5个数字(void enter())。
所示的两个类具有两个成员函数(enter1
和enter
),如果我理解问题,它们都返回一个int
(而不是蜂鸣void
)声明),但可能是“错误”的。
int enter()
{
cout << "enter the value of c,d,e" << endl;
cin >> c >> d >> e;
// The variable c,d and e here,are the private members of class B
// If we assume that all the values are correctly extracted from the input stream
// (we shouldn't,but for the sake of simplicity let's do it),those member variables
// are now set and there's no need to "return" them.
return (c,e);
// ^^^^^^^ The ',' here,is the comma operator(1).
// This is equivalent to
// return e;
}
所有变量都必须保持私有,并且必须使用朋友函数。
在发布的代码段中,整个类B
被声明为类friend
的{{1}},而不仅仅是某些函数。那可能是完成任务的一种方式,但似乎无法满足要求。
计算平均值的函数被声明为类A
的公共成员
B
在void average(int a,int b,int c,int d,int e)
{
float avg;
avg = ((a + b + c + d + e) / 5);
// ^ This is an INTEGER division,beeing the result of
// the sum and the literal 5 both integral types,it produces a TRUNCATED integer result
// which is only after converted to a float.
// ...
}
中这样(错误)调用
main
如何将对象作为参数传递?
满足所有要求的一种方法可以是将obj2.average(obj1.a,obj1.b,obj2.c,obj2.d,obj2.e);
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Those are all PRIVATE members,// invisible from 'main'
声明为自由函数,两个类的朋友(可以访问其私有成员),期望const类型的两个参数引用类A和B
Here是可能的实现,不一定是最佳设计。
(1)The built-in comma operator
,您无法在主函数中访问成员变量,因为它们是私有的。 您可以将第一个实例作为参数发送给方法,然后在方法内部使用A类成员变量。
#include<iostream>
using std::cin;
using std::cout;
using std::endl;
class A
{
int a;
int b;
public:
friend class B;
int enter1()
{
cout<<"enter the value of a and b"<<endl;
cin>>a>>b;
return(a,b);
}
};
class B
{
int c;
int d;
int e;
public:
void average(A obj)
{
float avg;
avg=((obj.a+obj.b+c+d+e)/5);
cout<<"average is "<<avg<<endl;
}
int enter()
{
cout<<"enter the value of c,e"<<endl;
cin>>c>>d>>e;
return(c,e);
}
};
int main()
{
A obj1;
B obj2;
obj1.enter1();
obj2.enter();
obj2.average(obj1);
return 0;
}