我有一个非常简单的任务要做。写一个定义时间的类。出于某种原因,在其中一个函数中我得到了一个错误,我不明白 我搜索了一个没有成功的解决方案,所以最后我决定将它发布在这里。
time.h中
class time
{
private:
int _hours;
int _minutes;
float _seconds;
bool checkHours(int hours);
bool checkMinutes(int minutes);
bool checkSeconds(float seconds);
public:
time(int hours=0, int minutes=0, float seconds=0);
time(const time & tm);
~time();
void hours(int hours);
int hours() const;
void minutes(int minutes);
int minutes() const;
void seconds(float seconds);
float seconds() const;
void operator=(time tm);
bool operator==(time tm);
void print();
time getTimeFromUser();
float getTimeAsFractionOfTheDay(time tm);
};
和 time.cpp
#include <iostream>
#include "time.h"
bool time::checkHours(int hours)
{
return hours>=0 && hours<24;
}
bool time::checkMinutes(int MS)
{
return MS>=0 && MS<60;
}
bool time::checkSeconds(float MS)
{
return MS>=0 && MS<60;
}
//constractors
time::time(int hours, int minutes, float seconds)
{
if(checkHours(hours) && checkMinutes(minutes) && checkSeconds(seconds))
{
_hours=hours;
_minutes=minutes;
_seconds=seconds;
}
else
{
cout<<"Error"<<endl; _hours=-1; _minutes=-1; _seconds=-1;
}
}
time::time(const time & tm)
{
_seconds = tm.seconds();
_hours = tm.hours();
_minutes=tm.minutes();
}
time::~time()
{
}
//get-set functions
void time::hours(int hours)
{
_hours=hours;
}
int time::hours() const
{
return _hours;
}
void time::minutes(int minutes)
{
_minutes=minutes;
}
int time::minutes() const
{
return _minutes;
}
void time::seconds(float seconds)
{
_seconds = seconds;
}
float time::seconds() const
{
return _seconds;
}
//operators
void time::operator=(time tm)
{
_hours=tm.hours();
_minutes=tm.minutes();
_seconds=tm.seconds();
}
bool time::operator==(time tm)
{
return _hours=tm.hours() && _minutes==tm.minutes() && _seconds==tm.seconds();
}
//some function
void time::print()
{
cout<<" "<<_hours<<":"<<_minutes<<":"<<_seconds<<" "<<endl;
}
time time::getTimeFromUser()
{
time newTime;
int userhours=-1;
int userminutes=-1;
float userseconds=-1;
while (!checkHours(userhours))
{
cout<<"enter hours"<<endl;
cin>>userhours;
if(!checkHours(userhours))
{
cout<<"Error try again"<<endl;
}
}
while (!checkMinutes(userminutes))
{
cout<<"enter minutes"<<endl;
cin>>userminutes;
if(!checkMinutes(userminutes))
{
cout<<"Error try again"<<endl;
}
}
while (!checkSeconds(userseconds))
{
cout<<"enter Seconds"<<endl;
cin>>userseconds;
if(!checkSeconds(userseconds))
{
cout<<"Error try again"<<endl;
}
}
newTime.seconds(userseconds);
newTime.hours(userhours);
newTime.minutes(userminutes);
return newTime;
}
float time::getTimeAsFractionOfTheDay(time tm)
{
return 0.0;
}
我得到了那些错误
我不明白我做错了什么。我认为这是愚蠢的,但我找不到它。
答案 0 :(得分:5)
事实证明,你是一个微妙的bug的受害者。
time
是在系统标头time.h
中声明的函数,它将通过iostream
包含在您的程序中。当您声明time time::getTimeFromUser()
时,编译器会看到返回值并认为您的意思是 function 时间!
clang
因其错误而显而易见:
time.cpp:122:1: error: must use 'class' tag to refer to type 'time' in this scope
time time::getTimeFromUser()
^
class
/usr/include/time.h:133:8: note: class 'time' is hidden by a non-type declaration of 'time' here
time_t time(time_t *);
^
修复方法是定义这样的特定函数:
class time time::getTimeFromUser() {
...
}
或者,如果使用C ++ 11,
auto time::getTimeFromUser() -> time {
...
}
答案 1 :(得分:1)
第一个问题:
bool time::operator==(time tm)
{
return _hours=tm.hours() && _minutes==tm.minutes() && _seconds==tm.seconds();
// ^
}
那里应该有一个比较运算符,而不是赋值:
bool time::operator==(time tm)
{
return _hours==tm.hours()
// ^^
&& _minutes==tm.minutes() && _seconds==tm.seconds();
}
第二个问题:
您正在使用cout
和endl
,它们属于std
命名空间,没有using
声明或using
指令。
在使用cout
,cin
和endl
作为非限定名称之前,您应该添加以下内容:
using std::cout;
using std::endl;
using std::cin;
或者,您可以选择在使用它们时完全限定其名称。例如:
std::cout<<"Error"<<endl; _hours=-1; _minutes=-1; _seconds=-1;
// ^^^^^
答案 2 :(得分:1)
问题是你的标题是time.h(已经作为标准标题)。 你认为你得到了你宣布的那个,但你得到了标准的那个。 此外,你没有你的类的声明,但标准标题。 将它重命名为Test.h和Tes.cpp,它将起作用 并且还在cpp文件的顶部添加使用命名空间std