错误:对象未声明,首先使用此功能

时间:2013-09-14 20:16:06

标签: c++ class object

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;              }

4 个答案:

答案 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;
 }