请各位朋友看以下程序为什么编译不过

billsbaidu 2009-04-20 12:55:28
#include<iostream>
using namespace std;
#include<windows.h>
class Date
{friend class Time;
public:
Date(int,int,int);
private:
int month;
int day;
int year;
};
class Time
{public:
Time(int,int,int);
void display();
private:
int hour;
int minute;
int sec;
private:
Date a;
};

Time::Time(int h,int m,int s)
{hour=h;
minute=m;
sec=s;
}
void Time::display()
{cout<<a.month<<"/"<<a.day<<"/"<<a.year<<endl;
cout<<hour<<":"<<minute<<":"<<sec<<endl;
Sleep(5000);

}
Date::Date(int m,int d,int y)
{month=m;
day=d;
year=y;
}
int main()
{Time t1(10,13,56);
Date d1(12,25,2004);
t1.display();
return 0;
}
...全文
187 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
术木 2009-04-21
  • 打赏
  • 举报
回复
主要原因是 使用Time类时 Date类 无法进行初始化(因为你没指定参数), 大家说得没有默认的Date构造函数是正确的,但是比较片面哈

你把 Date的构造函数声明 为 Date (int m = 12, int d = 12,int y = 2009);
就行了
术木 2009-04-21
  • 打赏
  • 举报
回复
我错了
以后试下在说吧
术木 2009-04-21
  • 打赏
  • 举报
回复
你把time类声明到 data类之前就行了吧

貌似编译器没找到 time 类,
amossavez 2009-04-21
  • 打赏
  • 举报
回复
说来说去还是个什么时候调用默认构造函数的问题,最近这个问题问的人很多呀,看来,hairetz有必要讲一讲呀,哈哈!
Jinhao 2009-04-20
  • 打赏
  • 举报
回复
编译错误应该很清楚呀,Date缺少默认构造函数
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 billsbaidu 的回复:]
为什么这样!我看的谭浩强老师的C++程序语言设计的书 好像没说到要合成默认构造函数的呀!这到底是什么回事的呀?
按理说Time()构造函数为什么不合成默认构造函数? 小弟刚看完面向对象部分的前两章,还请各位兄弟仔细说明下 小弟再给分!
我加了Date默认构造函数 但输出结果month、day、year都为0,但我本来是想month为12、day为25、year为2004
[/Quote]

需要默认的构造函数是因为你在Time类里声明了一个Date a; 成员,构造一个Time对象,肯定要用到Data的构造函数啊.
你不会连构造函数是干嘛的都不知道吧.
cyz497697772 2009-04-20
  • 打赏
  • 举报
回复
引用 15 楼 billsbaidu 的回复:
为什么这样!我看的谭浩强老师的C++程序语言设计的书 好像没说到要合成默认构造函数的呀!这到底是什么回事的呀?
按理说Time()构造函数为什么不合成默认构造函数? 小弟刚看完面向对象部分的前两章,还请各位兄弟仔细说明下 小弟再给分!
我加了Date默认构造函数 但输出结果month、day、year都为0,但我本来是想month为12、day为25、year为2004


jssz103b 2009-04-20
  • 打赏
  • 举报
回复
上面我说的地方错了
Time t1(10,13,56); 这句会调用Time 的3参数构造函数,同时还要调用Date::Date();来生成一个Date类对象
这句是对的 我试过了
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 billsbaidu 的回复:]
帮我看这个程序:
#include <iostream>
using namespace std;
#include <windows.h>
class Date
{friend class Time;

public:
Date(int,int,int);
private:
int month;
int day;
int year;
};
class Time
{public:99
Time(int,int,int);
void display();
private:
int hour;
int minute;
int sec;
private:
Date a(12,25,2004);
};


[/Quote]


这样帮你改了20楼的问题

class Date
{
friend class Time;
public:
Date(); //
Date(int,int,int); //你声明了一个带参构造函数,编译器就不会再为你合成默认构造函数了,所以自己再写个无参构造
private:
int month;
int day;
int year;
};
class Time
{public:
Time::Time(int h,int m,int s,int mon,int d,int y):a(mon,d,y)
{hour=h;
minute=m;
sec=s;
}
void set_Data(int,int,int); //添加一个设置Data类数据的方法
void display();
private:
int hour;
int minute;
int sec;
private:
Date a;
};


void Time::display()
{cout <<a.month <<"/" <<a.day <<"/" <<a.year <<endl;
cout <<hour <<":" <<minute <<":" <<sec <<endl;
Sleep(5000);

}

void Time::set_Data(int h,int m,int s) //你要处理的是a这个Data类啊
{
a.month=h;
a.day=m;
a.year=s;
}

Date::Date() //
{
month=0;
day=0;
year=0;
};

Date::Date(int m,int d,int y)
{month=m;
day=d;
year=y;
}
int main()
{
Time t1(10,13,56,12,25,2004); //在构造函数里初始化你的Data a,可以了不?
Date d1(12,25,2004);
//t1.set_Data(12,25,2004);
t1.display();
return 0;
}
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 jssz103b 的回复:]
开始问题 Date a;会调用构造函数,而你定义了一个带有参数的构造函数,不带参数的构造函数编译器就不会帮你生成了,所以需要声明
time类中由于没有对data成员初始化,在main()函数中也没复制,编译报错算好的了

后来的问题 关于数据成员的初始化问题,上面已提出


Time t1(10,13,56); 这句会调用Time 的3参数构造函数,同时还要调用Date::Date();来生成一个Date类对象
个人认为不会调用Date::Date(); 友员又不是继承
[/Quote]

class Time
{public:
Time(int,int,int);
void display();
private:
int hour;
int minute;
int sec;
private:
Date a; //看清楚楼主的声明
};
jssz103b 2009-04-20
  • 打赏
  • 举报
回复
开始问题 Date a;会调用构造函数,而你定义了一个带有参数的构造函数,不带参数的构造函数编译器就不会帮你生成了,所以需要声明
time类中由于没有对data成员初始化,在main()函数中也没复制,编译报错算好的了

后来的问题 关于数据成员的初始化问题,上面已提出



Time t1(10,13,56); 这句会调用Time 的3参数构造函数,同时还要调用Date::Date();来生成一个Date类对象
个人认为不会调用Date::Date(); 友员又不是继承
  • 打赏
  • 举报
回复
class Time
{public:99 //99是什么?
Time(int,int,int);
void display();
private:
int hour;
int minute;
int sec;
private:
Date a(12,25,2004); //这样何必呢?在Time的构造函数里加个构造函数列表来处理数据输入就可以了.
};

我在19楼贴的你怎么不用?
cyldf 2009-04-20
  • 打赏
  • 举报
回复

class Time
{public:
Time(int,int,int);
void display();
private:
int hour;
int minute;
int sec;
private:
Date a(12,25,2004); //这个地方调用Date构造函数肯定是错的
};
billsbaidu 2009-04-20
  • 打赏
  • 举报
回复
帮我看这个程序:
#include<iostream>
using namespace std;
#include<windows.h>
class Date
{friend class Time;

public:
Date(int,int,int);
private:
int month;
int day;
int year;
};
class Time
{public:99
Time(int,int,int);
void display();
private:
int hour;
int minute;
int sec;
private:
Date a(12,25,2004);
};

Time::Time(int h,int m,int s)
{hour=h;
minute=m;
sec=s;
}

Date::Date(int m,int d,int y)
{
month=m;
day=d;
year=y;
};

void Time::display()
{cout<<a.month<<"/"<<a.day<<"/"<<a.year<<endl;
cout<<hour<<":"<<minute<<":"<<sec<<endl;
Sleep(5000);

}

int main()
{Time t1(10,13,56);
t1.display();
return 0;
}
也是编译不过,是什么原因?
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 billsbaidu 的回复:]
为什么这样!我看的谭浩强老师的C++程序语言设计的书 好像没说到要合成默认构造函数的呀!这到底是什么回事的呀?
按理说Time()构造函数为什么不合成默认构造函数? 小弟刚看完面向对象部分的前两章,还请各位兄弟仔细说明下 小弟再给分!
我加了Date默认构造函数 但输出结果month、day、year都为0,但我本来是想month为12、day为25、year为2004
[/Quote]



自己看代码吧,不说了,.帮你实现功能了,自己琢磨

class Date
{
friend class Time;
public:
Date(); //
Date(int,int,int); //你声明了一个带参构造函数,编译器就不会再为你合成默认构造函数了,所以自己再写个无参构造
private:
int month;
int day;
int year;
};
class Time
{public:
Time(int,int,int);
void set_Data(int,int,int); //添加一个设置Data类数据的方法
void display();
private:
int hour;
int minute;
int sec;
private:
Date a;
};

Time::Time(int h,int m,int s)
{hour=h;
minute=m;
sec=s;
}
void Time::display()
{cout <<a.month <<"/" <<a.day <<"/" <<a.year <<endl;
cout <<hour <<":" <<minute <<":" <<sec <<endl;
Sleep(5000);

}

void Time::set_Data(int h,int m,int s) //你要处理的是a这个Data类啊
{
a.month=h;
a.day=m;
a.year=s;
}

Date::Date() //
{
month=0;
day=0;
year=0;
};

Date::Date(int m,int d,int y)
{month=m;
day=d;
year=y;
}
int main()
{Time t1(10,13,56);
Date d1(12,25,2004);
t1.set_Data(12,25,2004);
t1.display();
return 0;
}

billsbaidu 2009-04-20
  • 打赏
  • 举报
回复
哦 小弟看的有点糊涂了,但我现在明白,很谢谢你!
信念 2009-04-20
  • 打赏
  • 举报
回复
在类的构造函数里尽量确保每一个成员都初始化
cyldf 2009-04-20
  • 打赏
  • 举报
回复
如果你在类Date中没有定义构造函数,系统会为你合成一个默认构造函数
但是如果你已经定义了,就不会了。
billsbaidu 2009-04-20
  • 打赏
  • 举报
回复
为什么这样!我看的谭浩强老师的C++程序语言设计的书 好像没说到要合成默认构造函数的呀!这到底是什么回事的呀?
按理说Time()构造函数为什么不合成默认构造函数? 小弟刚看完面向对象部分的前两章,还请各位兄弟仔细说明下 小弟再给分!
我加了Date默认构造函数 但输出结果month、day、year都为0,但我本来是想month为12、day为25、year为2004
cyldf 2009-04-20
  • 打赏
  • 举报
回复
楼主需要定一个不带参数的构造函数~~
Date();

Date::Date()
{
year = 0;
month = 0;
day = 0;
}

加载更多回复(12)

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧