藏身时间类中的妖孽

下面的代码,是一位同学为《初识对象》中的项目3时间类写的。但错误有点诡异,他在QQ群中求助。

#include <iostream>
using namespace std;
class Time
{
public:
    void set_time();
    void show_time();
    void add_sec(int);
    void add_minute(int);
    void add_hour(int);
    void add_a_sec()
    {
        sec=sec+1;
        if(sec==60)
            {
             sec=0;
             minute=minute+1;
             if(minute==60)
             {
                 minute=0;
                 hour=hour+1;
             }
    }
    void add_a_minute()
    {
        minute=minute+1;
        if(minute==60)
             {
                 minute=0;
                 hour=hour+1;
             }
    }
    void add_an_hour()
    {
        hour=hour+1;
    }
private:
    bool is_time(int, int, int);   //这个成员函数设置为私有的,是合适的,请品味
    int hour;
    int minute;
    int sec;
};
void Time::set_time()
{
    char c1,c2;
    cout<<"请输入时间(格式hh:mm:ss)";
    while(1)
    {    cin>>hour>>c1>>minute>>c2>>sec;
        if(c1!=':'||c2!=':')
            cout<<"格式不正确,请重新输入"<<endl;
        else if (!is_time(hour,minute,sec))
            cout<<"时间非法,请重新输入"<<endl;
        else
            break;
    }
}
void Time::show_time()
{
    cout<<hour<<":"<<minute<<":"<<sec<<endl;
}
bool Time::is_time(int h,int m, int s)
{
    if (h<0 ||h>24 || m<0 ||m>60 || s<0 ||s>60)
        return false;
    return true;
}
void Time::add_sec(int adds)
{
    sec=sec+adds;
        while(sec>=60)
        {
           sec=sec-60;
           minute=minute+1;
           if(minute==60)
           {
               minute=0;
               hour=hour+1;
           }
        }
}
void Time::add_minute(int addm)
{
        minute=minute+addm;
        while(minute>=60)
        {
            minute=minute-60;
            hour=hour+1;
        }
}
void Time::add_hour(int addh)
{
        hour=hour+addh;
}
int main( )
{
    Time t1;
    int adds,addm,addh;
    cout<<"请输入要增加的秒,分,小时"<<endl;
    cin>>adds>>addm>>addh;
    t1.set_time( );
    T1.show_time( );
    t1.add_a_sec();
    t1.add_a_minute();
    t1.add_an_hour();
    t1.add_sec(adds);
    t1.add_minute(adds);
    t1.add_hour(addh);
    return 0;
}

读者朋友,你编译一下试试?

我在CodeBlocks中编译,提示一大堆:

||=== Build: Debug in example (compiler: GNU GCC Compiler) ===|
D:\CPP\codeBlock\example\main.cpp|43|error: extra qualification 'Time::' on member 'set_time' [-fpermissive]|
D:\CPP\codeBlock\example\main.cpp|43|error: 'void Time::set_time()' cannot be overloaded|
D:\CPP\codeBlock\example\main.cpp|6|error: with 'void Time::set_time()'|
D:\CPP\codeBlock\example\main.cpp|57|error: extra qualification 'Time::' on member 'show_time' [-fpermissive]|
D:\CPP\codeBlock\example\main.cpp|57|error: 'void Time::show_time()' cannot be overloaded|
D:\CPP\codeBlock\example\main.cpp|7|error: with 'void Time::show_time()'|
D:\CPP\codeBlock\example\main.cpp|61|error: extra qualification 'Time::' on member 'is_time' [-fpermissive]|
D:\CPP\codeBlock\example\main.cpp|67|error: extra qualification 'Time::' on member 'add_sec' [-fpermissive]|
D:\CPP\codeBlock\example\main.cpp|67|error: 'void Time::add_sec(int)' cannot be overloaded|
D:\CPP\codeBlock\example\main.cpp|8|error: with 'void Time::add_sec(int)'|
D:\CPP\codeBlock\example\main.cpp|81|error: extra qualification 'Time::' on member 'add_minute' [-fpermissive]|
D:\CPP\codeBlock\example\main.cpp|81|error: 'void Time::add_minute(int)' cannot be overloaded|
D:\CPP\codeBlock\example\main.cpp|9|error: with 'void Time::add_minute(int)'|
D:\CPP\codeBlock\example\main.cpp|90|error: extra qualification 'Time::' on member 'add_hour' [-fpermissive]|
D:\CPP\codeBlock\example\main.cpp|90|error: 'void Time::add_hour(int)' cannot be overloaded|
D:\CPP\codeBlock\example\main.cpp|10|error: with 'void Time::add_hour(int)'|
D:\CPP\codeBlock\example\main.cpp|109|error: expected '}' at end of input|
D:\CPP\codeBlock\example\main.cpp||In member function 'void Time::add_a_sec()':|
D:\CPP\codeBlock\example\main.cpp|13|error: 'sec' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|17|error: 'minute' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|21|error: 'hour' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|25|error: a function-definition is not allowed here before '{' token|
D:\CPP\codeBlock\example\main.cpp|42|error: expected '}' at end of input|
D:\CPP\codeBlock\example\main.cpp||In member function 'void Time::set_time()':|
D:\CPP\codeBlock\example\main.cpp|48|error: 'hour' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|48|error: 'minute' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|48|error: 'sec' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp||In member function 'void Time::show_time()':|
D:\CPP\codeBlock\example\main.cpp|59|error: 'hour' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|59|error: 'minute' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|59|error: 'sec' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp||In member function 'void Time::add_sec(int)':|
D:\CPP\codeBlock\example\main.cpp|69|error: 'sec' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|73|error: 'minute' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|77|error: 'hour' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp||In member function 'void Time::add_minute(int)':|
D:\CPP\codeBlock\example\main.cpp|83|error: 'minute' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|87|error: 'hour' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp||In member function 'void Time::add_hour(int)':|
D:\CPP\codeBlock\example\main.cpp|92|error: 'hour' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp||In member function 'int Time::main()':|
D:\CPP\codeBlock\example\main.cpp|101|error: 'T1' was not declared in this scope|
D:\CPP\codeBlock\example\main.cpp|103|error: 'class Time' has no member named 'add_a_minute'|
D:\CPP\codeBlock\example\main.cpp|104|error: 'class Time' has no member named 'add_an_hour'|
D:\CPP\codeBlock\example\main.cpp|109|error: expected unqualified-id at end of input|
||=== Build failed: 38 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

第一个提示“extra qualification 'Time::' on member 'set_time'”,说Time::多余,类外定义成员函数,不多余啊!
第二个提示“ 'void Time::set_time()' cannot be overloaded”,Time::set_time()不能被重载。
我大概知道怎么回事了。
用resource code formatter整理程序的格式,缩进发生变化,妖孽立刻现身。

下面是我和学生在QQ群中的对话,读者如果没有找出错误,不妨边看边试,按我的提示,自己找出问题来。

贺老师 2015-3-21 18:54:18
在Code::Blocks中,你整理一下格式,你会知道这个错有多么低级。然后回头再看这些错误提示,可以引出不少有价值的东西来。

贺老师 2015-3-21 18:55:28
其他同学,也可以从XX的低级错误中学到不少,试试吧。

学生 2015-3-21 18:57:37
糗大了

贺老师 2015-3-21 18:59:26
这样的错误,在学习过程中,价值连城!你经过了这样的错误,你就拥有了特别的财富。

学生 2015-3-21 19:00:37
 还是有一点不大明白

贺老师 2015-3-21 19:01:13
重排版了吗?

学生 2015-3-21 19:01:25
排了

贺老师 2015-3-21 19:01:34
你能确认void Time::set_time()是在类外了吗?

学生 2015-3-21 19:02:37
嗯  类内定义  类外写函数

贺老师 2015-3-21 19:03:06
如果类外定义,这个函数该顶头才是,

贺老师 2015-3-21 19:03:19
类内定义,才会缩进去。

贺老师 2015-3-21 19:03:46
你类内声明,类内定义。

贺老师 2015-3-21 19:04:22
这就重复了。

贺老师 2015-3-21 19:07:50
发现了吗?要不要再给点线索?

学生 2015-3-21 19:08:34
在给点吧 

贺老师 2015-3-21 19:09:07
你看类内定义的void add_a_sec(),在哪儿结束的?

学生 2015-3-21 19:10:09
  落了一个括号

贺老师 2015-3-21 19:10:26
手边有砖吗?

学生 2015-3-21 19:10:54
不是 是括号括错了   我去买块豆腐砖

学生 2015-3-21 19:11:45
谢谢贺老    

贺老师 2015-3-21 19:11:48
没砖为师就放心了。不必拍,我怕豆腐疼。学习过程中,很正常。

贺老师 2015-3-21 19:12:40
以后错误莫名其妙时,可以排版一下。若缩进不正常,问题一下就出来了。这也是讲究规范的价值。

学生 2015-3-21 19:13:00
恩恩 学到了

时间: 2024-08-17 18:32:27

藏身时间类中的妖孽的相关文章

c++日期时间类-在日期时间类中time_t,string的应用

问题描述 在日期时间类中time_t,string的应用 求大神指导,设计并实现一个时间日期类Datetime,分别以time_t,string和三个整数作为参数设计相应的构造函数,设计析构函数,并重载<,>,+,-和=等运算符号.其中至少包括一个以友元函数的形式重载的运算符.刚入门没有思路,求思路.对于time_t,string不太会应用..大神们帮一下忙!! 解决方案 急急急!!各位好汉,走过路过.给个思路

C++第9周项目2 - 实现时间类中的运算符重载

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8841620 [项目2-Time类]接第8周项目2,定义Time类中的<<和>>运算符重载,实现时间的输入输出,改造原程序中对运算结果显示方式,使程序读起来更自然. 参考解答: #include <iostream> using nam

Java中的日期和时间类以及Calendar类用法详解_java

Java日期和时间类简介 Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类,其构造方法比较多,下面是常用的两个: Date():使用当前的日期和时间初始化一个对象. Date(long millisec):从1970年01月01日00时(格林威治时间)开始以毫秒计算时间,计算 millisec 毫秒.如果运行 Java 程序的本地时区是北京时区(

VC++实现非窗口类中使用定时器的方法

定时器在Windows 的程序中的作用不可忽略,也随处可见.设定一个时间间隔每0.5秒或者1秒钟刷新一次时钟,这样就可以完成一个简单的电子钟程序.在不同的编程工具中定时器的用法也不同,Visual C++中也给我们提供了实现这种功能的方法,而且方法不只一种.在窗口类中是使用定时器比较很简单,用SetTimer()设置了定时器之后,并在Class Wizard中添加了WM_TIMER消息映射后,您就可以在映射函数OnTimer()中添加代码实现,来定时完成您的任务,而且还支持任意多个定时器,这种方

java 某个类的几个对象,这些对象调用类中一个函数,是各自拥有自己的函数代码还是使用同一段代码?

问题描述 1.java 某个类的几个对象,这些对象调用类中一个函数(普通的函数),是各自拥有自己的函数代码还是使用同一段代码?2.java 继承中,子类从父类得到一些普通函数,这些函数的代码,是子类自己独自拥有一份还是和父类使用同一段函数代码.3.第一次发帖,积分什么的不会搞,貌似自己也没有积分,呵呵,大家包涵! 解决方案 引用1.java 某个类的几个对象,这些对象调用类中一个函数(普通的函数),是各自拥有自己的函数代码还是使用同一段代码?这几个对象调用的当然是同一段代码了.jvm中有一个ja

成员变量-如何让JAVA不自动回收某个类中的变量?

问题描述 如何让JAVA不自动回收某个类中的变量? 我的一个web应用中 初始化的时候会给一个类中的静态成员变量赋值,然后隔一段时间会改变成员变量中的值,这样java会自动回收吗?如果长时间不改变成员变量的值会给我回收掉吗?如果回收的话有什么办法可以不让他回收? 解决方案 静态类本身不会回收,但是如果你的程序运行在容器中(比如web程序),而容器本身会回收,这种情况相当于关闭了你的程序.那么当然这些变量全部都没有了. 你有两个办法,一个是根据容器的约定,阻止它回收.比如说容器规定,10分钟没有用

c++-C++中 不能在类中访问this的地址

问题描述 C++中 不能在类中访问this的地址 如class a{ public: void show(){ cout<<&this; }}如果this是一个指针,为什么不能访问它的地址? 解决方案 首先要搞清楚this指针是存放在哪的?编译器在生成程序时加入了获取对象首地址的相关代码,并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同),也就是成员函数的其它参数正常都是存放在栈中,而this指针参数则是存放在寄存器中.寄存器不能像被外设寄存器

源码剖析AQS在几个同步工具类中的使用

感谢网友[张超盟]的投稿 1. 前言 AQS(AbstractQueuedSynchronizer)是 java.util.concurrent的基础.J.U.C中宣传的封装良好的同步工具类Semaphore.CountDownLatch.ReentrantLock.ReentrantReadWriteLock.FutureTask等虽然各自都有不同特征,但是简单看一下源码,每个类内部都包含一个如下的内部类定义: abstract static class Sync extends Abstra

javacalendar-java实用时间类Calendar的set方法变成变量

问题描述 java实用时间类Calendar的set方法变成变量 java实用时间类Calendar的set方法变成变量 public void run() { Calendar cal = Calendar.getInstance(); cal.set(year1, year2, year3, year4, year5, year6); } 怎么把 cal.set(year1, year2, year3, year4, year5, year6);设置为变量,根据数据库的查询,然后插进去cal