-1

我在头文件中的类中使用的类有点麻烦。

我有课时间.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;但这是非法的,因为class它是 C++ 关键字。

  • 您正在尝试访问Class对象 ( class[i].startTime) 的私有成员。这又是违法的。您需要该数据成员的公共访问器:

  • 您正在调用一个不存在的函数 ( print24())。如果您打算调用print24hour(),则此函数不带任何参数。

综上所述,您需要做三件事:

  1. startTime为in添加访问器Class

    class Class
    {
      //...
    public:
      Time GetStartTime() {return startTime;}
    };
    
  2. 为您的数组使用合法名称并使用std::vectoror 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
class Class
{
    private:
      Time startTime;

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

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

你要么想要那个,要么startTime公开。

注意const; 如果您不希望返回的引用为const,请立即startTime公开。您可能认为制作它private可以提高封装性;是的,它确实如此,只要您不提供对变量的读写访问权限,如果您不标记成员函数 return type ,就会发生这种情况const

如果您的打印功能未标记const,那么您的 const 正确性不存在。如果在这里使用 const 引用作为返回类型,那么您需要解决一些问题。

相关阅读:伪类和准类

于 2012-11-08T11:14:01.623 回答
0

您正在尝试直接使用该对象访问类的私有成员。

请在此处阅读有关公共和私有访问说明符的信息。

于 2012-11-08T11:08:07.047 回答