类的成员函数是属于类的,所以调用的时候是通过指针this调用的。
而类的友元函数不属于类,当然也不能有this指针了,也就是在友元函数中不能出现this指针。
同时友元函数是有关键字friend修饰。
再有的情况下,友元函数是很有用的。特别是在重载一些 *** 作符的时候用处很明显。我的回答:友元函数显然是可以的,但是你说的头文件相互包含的问题是可以避免的
你在Book类里面声明Manage类的成员函数为友元函数,因此必然要包含Manage类的头文件,而且你最好使用提前声明,加一句class Manage;
你在Manage类里面的函数(声明为友元的函数),可以用的是Book类的声明,也就是只用声明class Book,不用包含头文件,因为在头文件中不需要展开具体的函数,因此不需要包含Book类的头文件,只需要在Manage类的cpp文件中包含Book类的头文件即可。// testcpp : 定义控制台应用程序的入口点。
//
#include "stdafxh"
#include<iostream>//头文件
using namespace std;//命名空间
template <typename T>//模板
class A
{
public://外部接口
A(int x,T b[]);//构函数传入数据
void outputm_x();//输出边数
void outputx();//输出各边长
double c();//求周长
template <typename T,class C>//模板
friend double add(A<T> x,A<C> y);
~A(){};
private://数据成员
int m_x;//边数
double a[100];//各变长
};
template <typename T>
A<T>::A(int x,T b[])//成员函数实现
{
m_x=x; for(int i=0;i<m_x;i++)
{
a[i]=b[i];
}
}
template <typename T>
void A<T>::outputm_x()//成员函数实现
{
cout<<"边数为:"<<m_x<<endl;
}
template <typename T>
void A<T>::outputx()//成员函数实现
{
cout<<"各变长为:"<<endl;
for(int i=0;i<m_x;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
template <typename T>
double A<T>::c()//成员函数实现
{
double sum=0;
for(int i=0;i<m_x;i++)
{
sum=sum+a[i];
}
return sum;
}
template <typename T,class C>//模板
double add(A<T> x,A<C> y)
{
return xc()+yc();
}//友元函数求周长和
int main()
{
int x1=3,x2=4;//边数
int b1[100]={1,3,3};//多边形各变长
double b2[100]={21,31,42,5,5};//多边形各变长
A<int> A1(x1,b1);//创建类的对象A1并初始化
A<double> A2(x2,b2);//创建类的对象A2并初始化
A1outputm_x();//测试
A1outputx();//测试
cout<<"周长为:"<<A1c()<<endl;//测试
A2outputm_x();//测试
A2outputx();//测试
cout<<"周长为:"<<A2c()<<endl;//测试
cout<<"周长和为:"<<add(A1,A2)<<endl;//友元函数测试
return 0;
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)