程式通不過,什么情況,求指點
#include<iostream>
using namespace std;
class CDate; //類的提前參考宣告
class CTime
{
public:
CTime(int h,int m,int s):hour(h),minute(m),second(s){}
friend void CDate::display(CTime t); //宣告CDate中的display為友元函式
void display()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
private:
int hour;
int minute;
int second;
};
class CDate
{
public:
CDate(int y,int m,int d):year(y),month(m),date(d){}
void display(CTime t)
{
t.display();
cout<<year<<"/"<<month<<"/"<<date<<endl;
}
private:
int year;
int month;
int date;
};
int main()
{
CTime t(11,11,11);
CDate d(12,12,12);
d.display(t);
system("pause");
return 0;
}
uj5u.com熱心網友回復:
我覺得你對友元的理解不太正確,void display(CTime t) //用了引數t,t.display()呼叫 不需要友元
而 class CTime 中并沒有用到CDate::display,所以友元宣告是多余的
uj5u.com熱心網友回復:
我說錯了,應該是CDate::display并沒有訪問class CTime 的私有或保護成員,所以友元宣告是多余的。
——————
感覺這個例子不太適合使用友元,如果要用,我這樣改一下也是可以通過的:
#include<iostream>
using namespace std;
class CDate; //類的提前參考宣告
class CTime
{
public:
CTime(int h,int m,int s):hour(h),minute(m),second(s){}
// friend void CDate::display(CTime &t); //宣告CDate中的display為友元函式
friend class CDate;
void display()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
private:
int hour;
int minute;
int second;
};
class CDate
{
public:
CDate(int y,int m,int d):year(y),month(m),date(d){}
void display(CTime &t)
{
// t.display();
cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
cout<<year<<"/"<<month<<"/"<<date<<endl;
}
private:
int year;
int month;
int date;
};
int main()
{
CTime t(11,11,11);
CDate d(12,12,12);
d.display(t);
system("pause");
return 0;
}
我用VC6.0和VC2010 Express版,
// friend void CDate::display(CTime &t); //不可以
friend class CDate; //可以
不知道為什么?
uj5u.com熱心網友回復:
代碼順序適當調整一下就可以了。#include<iostream>
using namespace std;
class CTime; //類的提前參考宣告
class CDate
{
public:
CDate(int y,int m,int d):year(y),month(m),date(d){}
void display(CTime &t);
private:
int year;
int month;
int date;
};
class CTime
{
public:
CTime(int h,int m,int s):hour(h),minute(m),second(s){}
friend void CDate::display(CTime &t); //宣告CDate中的display為友元函式
void display()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
private:
int hour;
int minute;
int second;
};
void CDate::display(CTime &t)
{
// t.display();
cout<<t.hour<<":"<<t.minute<<":"<<t.second<<endl;
cout<<year<<"/"<<month<<"/"<<date<<endl;
}
int main()
{
CTime t(11,11,11);
CDate d(12,12,12);
d.display(t);
system("pause");
return 0;
}
uj5u.com熱心網友回復:
謝謝啦
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/62972.html
標籤:基礎類
