-1

ヘッダー ファイルから、クラス内で使用されるクラスに少し問題があります。

私は time.h でクラスの時間を持っています:

#ifndef TIME_H
#define TIME_H
#include <iostream>
using namespace std;

class Time  
{
private:
    int hour, minute, second;
public:
    Time();
    ~Time();

    Time(int h, int m, int s);

    int getHour();
    int getMinute();
    int getSecond();

    void setHour(int hour);
    void setMinute(int minute);
    void setSecond(int second);

    Time getTimeFromUser(Time b);
    bool validTime(Time a);
    void print24Hour(Time a);
    void print12Hour(Time b);
};

#endif

スケジュール.h

#ifndef SCHEDULE_H
#define SCHEDULE_H
#include <iostream>
#include "time.h"
using namespace std;

class Class 
{
    private:
        string name;
        int credits;
        bool majorRequirement;
        double avgGrade;
        string days;

        Time startTime;
        Time endTime;

    public:
        Class();
        ~Class();

        Class(string namae, int cred, bool majorReq, double avg, string day);

        //Mutate
        void setName(string h);
        void setCredits(int c);
        void setMajorRequirement(bool set);
        void setAvgGrade(double g);
        void setDays(string d);

        void getStartTimeFromUser(Time b);
        void getEndTimeFromUser(Time e);

        // Access
        string getName();
        int getCredits();
        bool getMajorRequirement();
        double getAvgGrade();
        string getDays();

        Time& getStartTime();
        Time& getEndTime();
};

#endif

スケジュール.cpp:

Class::Class() 
{
    string name = "";
    int credits = 0;
    bool majorRequirement = false;
    double avgGrade = 0.0;
    string days = "";
}

Time::Time()
{
    int hour = 0;
    int minute = 0;
    int second = 0;
}

Class::Class(string namae, int cred, bool majorReq, double avg, string day) 
{
    name = namae;
    credits = cred;
    majorRequirement = majorReq;
    avgGrade = avg;
    days = day;
}

Time::Time(int h, int m, int s)
{
    second = s;
    minute = m;
    hour = h;
}

Time getTimeFromUser(Time b)
{
    string time = "";

    string hourS, minuteS, secondS = new string();

    getline(cin,time);

    hourS = time.substr(0,2);
    minuteS = time.substr(3,2);
    secondS = time.substr(6,2);

    b.hour = atoi(hourS.c_str());
    b.minute = atoi(minuteS.c_str());
    b.second = atoi(secondS.c_str());

    return b;
}

void getStartTimeFromUser(Time b)
{
    startTime = getTimeFromUser(b);
}

void getEndTimeFromUser(Time e)
{
    endTime = getTimeFromUser(e);
}


Other Mutators and Accessors here.

メインが長い。これは、非常に凝縮されたバージョンです。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <iomanip>
#include "time.h"
#include "schedule.h"
using namespace std;

int main()
{
    // Expecting that variables are properly declared

    Class * klass = new Class[classcount];

    cout << "Enter the start time for the class (format is HH:MM:SS): ";
    klass[i].getStartTimeFromUser(classB);

    cout << "Enter the end time for the class (format is HH:MM:SS): ";
    klass[i].getEndTimeFromUser(classE);

for(int i = 0; i < classcount; i++)
    {
    // Data collected via getline and changed through mutators/accessors
    // Problems arise when working with Time

    klass[i].getStartTime().print24hour();
    }
}

かなりの数の「時、秒、分など」が表示されます。個人的なエラーです。単純なことをかなり間違った方法で行っていると思います。助けてください。

私はこれをたくさん手に入れます:

time.h:10:7: error: ‘int Time::hour’ is private
schedule.cpp:146:4: error: within this context
time.h:10:13: error: ‘int Time::minute’ is private
schedule.cpp:147:4: error: within this context
time.h:10:21: error: ‘int Time::second’ is private
schedule.cpp:148:4: error: within this context
schedule.cpp: In function ‘void getStartTimeFromUser(Time)’:
schedule.cpp:155:16: error: ‘setStartTime’ was not declared in this scope
schedule.cpp: In function ‘void getEndTimeFromUser(Time)’:
schedule.cpp:160:2: error: ‘endTime’ was not declared in this scope
time.h: In function ‘bool validTime(Time)’:
4

4 に答える 4

3

コードにいくつかのエラーがあります:

  • classあなたの関数では;main()の配列を表している と思います。Classしかし、これはclassC++ のキーワードであるため、違法です。

  • Classオブジェクト ( )のプライベート メンバにアクセスしようとしていますclass[i].startTime。これまた違法です。そのデータ メンバーへのパブリック アクセサーが必要になります。

  • 存在しない関数を呼び出しています ( print24())。を呼び出す場合print24hour()、この関数はパラメーターを取りません。

すべてをまとめると、次の 3 つのことを行う必要があります。

  1. startTimeinのアクセサを追加しますClass

    class Class
    {
      //...
    public:
      Time GetStartTime() {return startTime;}
    };
    
  2. 配列に正当な名前を使用し、std::vectorまたはを使用しstd::arrayます。

    std::vector<Class> classArray;
    // OR:
    std::array<Class, SIZE> classArray;
    
  3. 適切なメソッドを正しく呼び出す:

    classArray[i].GetStartTime().print24hour();
    
于 2012-11-08T11:12:49.510 に答える
0

class[i].startTime.print24(getStartTime())アクセスしたいのですが、公開mainする必要がありますstartTime

これが良いスタイルであるかどうかは別の質問です。

于 2012-11-08T11:04:14.637 に答える
0

オブジェクトを直接使用して、クラスのプライベートメンバーにアクセスしようとしています。

パブリックおよびプライベートアクセス指定子については、こちらをお読みください。

于 2012-11-08T11:08:07.047 に答える
0
class Class
{
    private:
      Time startTime;

    public:
      const Time & getStartTime(){
        return startTime;
      }    
};

int main()
{
    Class c;
    c.getStartTime().print24Hour(); 
}

あなたはそれを望むか、startTime公開します。

に注意してくださいconst。返された参照を にしたくない場合はconststartTime今すぐ公開してください。privateこれを作成すると、カプセル化が改善されると思うかもしれません。はい、変数への読み取り/書き込みアクセスを提供しない限り、メンバー関数の戻り値の型をマークしない場合に発生しますconst

印刷機能がマークされconstていない場合、const-correctness は存在しません。ここで戻り値の型として const 参照を使用している場合は、いくつか修正する必要があります。

関連資料:疑似クラスと準クラス

于 2012-11-08T11:14:01.623 に答える