3

私はかなり単純な仕事をしました。時間を定義するクラスを作成します。何らかの理由で、関数の 1 つで、理解できないエラーが発生しました。
成功しなかった解決策を探したので、最終的にここに投稿することにしました。

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

そして、私はそれらのエラーを得ました

ここに画像の説明を入力

私は何が間違っていたのか理解できません。ばかげていると思いますが、見つかりません。

4

3 に答える 3

5

結局のところ、あなたは微妙なバグの犠牲者です。

timeは、システム ヘッダーで宣言された関数time.hであり、 を介してプログラムに組み込まれますiostream。を宣言するtime time::getTimeFromUser()と、コンパイラは戻り値を見て、関数の時間を意味していると考えます!

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 {
    ...
}
于 2013-03-31T10:00:21.837 に答える
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();
}

2番目の問題:

宣言やディレクティブなしで、名前空間に属するcoutandを使用しています。endlstdusingusing

coutcin、およびendlを非修飾名として使用する前に、次を追加する必要があります。

using std::cout;
using std::endl;
using std::cin;

または、それらを使用するときに名前を完全修飾することを選択できます。例えば:

    std::cout<<"Error"<<endl; _hours=-1; _minutes=-1; _seconds=-1;
//  ^^^^^
于 2013-03-31T09:57:37.630 に答える
1

問題は、ヘッダーが time.h であることです (既に標準ヘッダーとして採用されています)。宣言したものを取得すると思いますが、標準のものを取得します。そのため、クラスの宣言はありませんが、標準ヘッダーがあります。名前を Test.h および Tes.cpp に変更すると動作します。また、cpp ファイルの先頭に using namespace std を追加します。

于 2013-03-31T11:21:58.183 に答える