C++使用了未定义类型

#include<iostream>usingnamespacestd;classdate;//声明date类classtime//定义time类{public:time... #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”的声明
1>.\11题.cpp(10) : error C2228: “.month”的左边必须有类/结构/联合
麻烦大家看看啊,多谢啦啊
展开
 我来答
vbtraz
推荐于2016-05-17 · TA获得超过5533个赞
知道大有可为答主
回答量:4152
采纳率:0%
帮助的人:4534万
展开全部
这样提前声明是没用的。 编译time的时候date类的结构还不知道, 这时候你就算提前声明也只能用date类的指针, 而不能有date型变量。 否则编译器没法处理这个变量成员的位移之类的东西所以也就没法编译

所以如果你要在time里用到date, 你就得把date写到前头去。 或者你在time里参数就写 date* 。当然这样也不可以把实现写在date前头了, 否则d.month之类的表达式还是处理不了
Ms_yam
2009-10-26 · TA获得超过712个赞
知道小有建树答主
回答量:152
采纳率:100%
帮助的人:115万
展开全部
你把成员函数void display(date &d)的定义放在date类之后就行。

前向声明只是为了在定义之前声明之后的作用域中使用它来声明它的对象或指针,但不能访问它的对象的成员。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友99f2f2f8a
2009-10-26 · TA获得超过399个赞
知道答主
回答量:192
采纳率:0%
帮助的人:0
展开全部
提前声明不是这么用的。
对于这个问题建议将date类的定义放在time类前。
另外还有个问题。你的友元定义也是有问题的。
将time类声明为友元的正确做法应该是:friend class time;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者n1DeXWbuqc
2019-10-07 · TA获得超过3766个赞
知道大有可为答主
回答量:3152
采纳率:31%
帮助的人:184万
展开全部
你可以把a,b类分为两个文件来定义,然后分别用include包含需要的类头文件。不过,不建议你使用交叉定义的方式来定义类,可以使用一个通用类或者定义一个父类来解决这个问题。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jaycnvip
2009-10-27 · TA获得超过767个赞
知道小有建树答主
回答量:998
采纳率:100%
帮助的人:661万
展开全部
friend time;//将time设为date的友元类
改成
friend class time;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式