H, 这是我的代码,给出错误对象是未申报的首先使用这个功能虽然每件事都没问题,为什么会这样呢?该类对主函数不可见,并且给出错误。
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
using namespace std;
class time
{
int min;
int sec;
int hour;
public:
time()
{
cout << "uninitialized constructor " << endl << endl;
min = 0;
sec = 0 ;
hour = 0;
}
time(int m, int s, int h)
{
min= m;
sec = s;
hour = h;
}
void display()
{
cout << min << ":" << sec <<":" << hour ;
}
void add(time t1, time t2)
{
int sece = t1.sec+t2.sec;
int mint = t1.min + t2.min;
int hours = t1.hour + t2.hour;
time t4(sece , mint, hours);
}
};
int main(void)
{
time t1(23, 45,11);
time t2(11,59,59);
time t3;
t3.add(t1,t2);
t3.display();
getch();
}
其次,这段代码是什么意思?
time(int h,int m,int s):hrs(h),mins(m),secs(s){}
可以替换为: time(int m,int s,int h) { min = m; sec = s; 小时= h; }
答案 0 :(得分:2)
显示确切的错误。
time(int h,int m,int s):hrs(h),mins(m),secs(s){}
这是初始化列表。
// could it be replaced by this:
time(int m, int s, int h) { min= m; sec = s; hour = h; }
不,因为您更改了参数顺序。
但time(int h,int m,int s):hrs(h),mins(m),secs(s){}
与
time(int h, int m, int s) { hour = h; min = m; secs = s; }
答案 1 :(得分:1)
您选择的类名有点不幸,因为标准库中已经有一个名为std::time
的函数,所以只需选择其他名称或考虑使用名称空间。
关于第二个问题:
这种初始化成员变量的方式称为 initializer list ,是首选的使用方式。特别是在处理对象而不是原始数据类型时,只有初始化列表才能确保对象的构造函数只被调用一次。否则,将隐式调用默认构造函数,仅用于在构造函数体内第二次初始化对象。
答案 2 :(得分:0)
至于你的第二个问题 -
time(int h,int m,int s):hrs(h),mins(m),secs(s){}
此行使用 MIL - Member initialization list,至于使用/不使用 - Why should I prefer to use member initialization list?
通过一些小的修改,您可以开始使用它。
请提供第一个问题的编译错误,没有看到错误,我可以看到构建可能失败的一个主要原因。该语言已定义名为time
的类型,因此您可能需要更改名称。
答案 3 :(得分:0)
如果您希望t3真正具有t1,t2之和,则代码将无法打印正确的输出。如果代码实际上是必需的,那就没关系了。
但是,如果add真的需要添加,那么不要在函数中创建另一个局部变量t4。而是修改成员变量,如下所示:
void add(Time t1, Time t2)
{
sec = t1.sec+t2.sec;
min = t1.min + t2.min;
hour = t1.hour + t2.hour;
min+=sec/60; sec%=60;
hour+=min/60; min%=60;
}