藏身时间类中的妖孽

下面的代码,是一位同学为《初识对象》中的项目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整理程序的格式,缩进发生变化,妖孽立刻现身。

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

贺老师 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-10-01 00:32:32

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

Java中六大时间类的使用和区别

关于java中六个时间类的使用和区别 java.util.Date java.sql.Date  java.sql.Time  java.sql.Timestamp java.text.SimpleDateFormat java.util.Calendar java.util.Date日期格式为:年月日时分秒 java.sql.Date日期格式为:年月日java.sql.Time日期格式为:时分秒 java.sql.Timestamp日期格式为:年月日时分秒纳秒(毫微秒) 从数据库中取出来的日期

Hibernate在实体类中对于时间的注解

在时间类型DATE 属性上添加一个 @Temporal(TemporalType.DATE)(精确到年月日)@Temporal(TemporalType.TIME)(精确到时分秒)@Temporal(TemporalType.TIMESTAMP)(默认年月日时分秒)示例: @Temporal(TemporalType.DATE)private Date updateDate; 有了这个就不需要用java代码将时间戳,转换成需要的日期格式.直接在实体类中进行注解!

Java中常见时间类的使用

模拟场景针对于常用的操作API,比如流操作(字符流.字节流),时间操作等,仅仅了解概念性的定义终究是无法了解该类的用途和使用方式:这种情况在使用的时候便一脸茫然,脑海中映射不到对应的知识点.本篇博客将通过一个简单的应用场景来体会这两个类的使用. 项目开发阶段,有一个关于下单发货的需求:如果今天下午三点前进行下单,那么发货时间是明天如果今天下午三点后机型下单,那么发货时间是后天如果被确定的发货时间是周日的话,那么在此时间上再加一天为最终发货时间 牛刀小试( java 原始)整体逻辑:主函数创建下单

Java日期时间API系列2-----Jdk7及以前的日期时间类在mysql数据库中的应用

1.java中与数据库相关的时间类 java提供与mysql方便交互的三种数据类型: java.sql.Date java.sql.Time java.sql.Timestamp 它们都是继承java.util.Date,算是对该类的精简,很适合跟数据库交互. 2.MySQL 中的日期和时间类型 日期和时间类型 字节 最小值 最大值 DATE 4 1000-01-01 9999-12-31 DATETIME 8 1000-01-01 00:00:00 9999-12-31 23:59:59 TI

Java中Date时间类

Date:表示特定的瞬间,精确到毫秒. 构造方法: Date():根据当前的默认毫秒值创建日期对象 Date(long date):根据给定的毫秒值创建日期对象 public static void mian(String[] args){ //创建对象 Date d = new Date(); System.out.println("d:"+d);//d:Wed Feb 13 19:17:43 CST 2019 //创建对象 lont time = System.currentTim

SimpleDateFormat关于时间类的一些常用处理

项目中经常会出现对时间类的一些处理,记录一下: 实例一:/** * 获取当前时间是星期几? * * @param args */ public static void main(String[] args) { SimpleDateFormat format = new SimpleDateFormat("E"); Date date = new Date(); String s = format.format(date); System.out.println("s:&qu

Kotlin操作符重载:把标准操作加入到任何类中(KAD 17)

作者:Antonio Leiva 时间:Mar 21, 2017 原文链接:https://antonioleiva.com/operator-overload-kotlin/ 就像其他每种语言一样,在Kotlin中,已经预定义了一些操作符执行一定的操作. 最典型的是加(+),减(-),乘(*),除(/),而且还有很多. 类似Java这样的一些语言,这些操作符被限制在一些特定的数量类型上,且没有方法让其他类型数据使用这些操作符. 还有在像Scala这样的其他语言中,由于函数名称可接受任何符号,我

Problem E: 时间类的静态成员计数

Description 封装一个时间类Time,用于时间处理的相关功能,支持以下操作: 1. Time::Time()无参构造方法. 2. Time::Time(int,int,int)构造方法:传递时分秒的三个参数构造对象. 3. Time::Time(const T&)拷贝构造方法. 4. 对象整体读写方法: Time::setTime(int,int,int)方法:传递时分秒三个参数修改Time对象的时分秒数.该方法返回修改后的对象. Time::setTime(const T&)方

Problem A: 时间类的拷贝和整体读写

Description 封装一个时间类Time,用于时间处理的相关功能,支持以下操作: 1. Time::Time()无参构造方法. 2. Time::Time(int,int,int)构造方法:传递时分秒的三个参数构造对象. 3. Time::Time(const T&)拷贝构造方法.拷贝构造函数调用时输出"There was a call to the copy constructor : h,m,s","h,m,s"为所构造对象的时分秒数值,无需补0.