我在类头文件中使用的类有点麻烦。
我有一个上课时间。:
#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
Schedule.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
Schedule.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)’:
答案 0 :(得分:3)
您的代码中存在多个错误:
我假设class
函数中的main()
代表一个数组
Class
;但这是非法的,因为class
是C ++关键字。
您正在尝试访问Class
对象的私有成员
(class[i].startTime
)。这又是违法的。你需要一个
该数据成员的公共访问者:
您正在调用一个不存在的函数(print24()
)。如果你
打算调用print24hour()
,此函数不带参数。
总而言之,你需要做三件事:
在startTime
中添加Class
的访问者:
class Class
{
//...
public:
Time GetStartTime() {return startTime;}
};
为您的阵列使用合法名称并使用std::vector
或std::array
:
std::vector<Class> classArray;
// OR:
std::array<Class, SIZE> classArray;
正确调用正确的方法:
classArray[i].GetStartTime().print24hour();
答案 1 :(得分:0)
我想从class[i].startTime.print24(getStartTime())
访问main
您需要公开startTime
。
如果这是好的风格是另一个问题。
答案 2 :(得分:0)
您正在尝试直接使用该对象访问类的私有成员。
请阅读有关公共和私人访问说明符here的信息。
答案 3 :(得分:0)
class Class
{
private:
Time startTime;
public:
const Time & getStartTime(){
return startTime;
}
};
int main()
{
Class c;
c.getStartTime().print24Hour();
}
你想要那个,或者让startTime
公开。
注意const
;如果您不希望返回的引用为const
,请立即公开startTime
。您可能认为使private
改进封装;是的,只要您不提供对变量的读写访问权限,如果您没有标记成员函数返回类型const
,就会发生这种情况。
如果您的打印功能未标记为const
,则您的常量不存在。如果在这里使用const引用作为返回类型,那么你需要解决一些问题。