C++使用了未定义类型

来源:百度知道 编辑:UC知道 时间:2024/06/14 17:01:40
#include<iostream>
using namespace std;
class date;//声明date类
class time//定义time类
{
public:
time(int h,int m,int s):hour(h),minute(m),sec(s){}
void display(date &d)//输入函数,输出时间和日期
{
cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;
cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
private:
int hour;
int minute;
int sec;
};
class date//定义date类
{
public:
date(int m,int d,int y):month(m),day(d),year(y){}
friend time;//将time设为date的友元类
private:
int month;
int day;
int year;
};
int main()//主函数
{
time t(14,37,29);
date d(10,26,2009);
t.display(d);
return 0;
}
我明明提前声明了date类的,可是调试的时候出现下面句子:
1>.\11题.cpp(10) : error C2027: 使用了未定义类型“date”
1> .\11题.cpp(3) : 参见“date”的声明

这样提前声明是没用的。 编译time的时候date类的结构还不知道, 这时候你就算提前声明也只能用date类的指针, 而不能有date型变量。 否则编译器没法处理这个变量成员的位移之类的东西所以也就没法编译

所以如果你要在time里用到date, 你就得把date写到前头去。 或者你在time里参数就写 date* 。当然这样也不可以把实现写在date前头了, 否则d.month之类的表达式还是处理不了

你把成员函数void display(date &d)的定义放在date类之后就行。

前向声明只是为了在定义之前声明之后的作用域中使用它来声明它的对象或指针,但不能访问它的对象的成员。

提前声明不是这么用的。
对于这个问题建议将date类的定义放在time类前。
另外还有个问题。你的友元定义也是有问题的。
将time类声明为友元的正确做法应该是:friend class time;

friend time;//将time设为date的友元类
改成
friend class time;