这次我会尝试更具描述性,我一直在做研究,但似乎无法弄明白。我有一个名为Time的课程,看起来像这样:
class Time{
private:
int minutes;
int hours;
public:
Time();
Time(int h, int m);
void addMin(int m);
void addHour(int h);
void setTime(int m, int h);
void reset(int h=0, int =0);
Time sum(const Time &t) const; //Add one time to another time.
Time sum(int m) const;
Time operator*(double other) const;
void show() const;
};
我有一个看起来像这样的文件:
90 1 3.0
1 1 100.0
2 34 5.1
每行中的第一个数字是times[i].hours
,第二个数字是times[i].minutes
,第三个数字是要存储在math[i]
中的双精度数。由于变量是私有的,我需要调用'setTimeHours(int h)'和setTimeMinutes(int m)
,我不知道该怎么做。这就是我所拥有的。
int number_of_lines = 0;
std::string line;
while (std::getline(inputFile, line)){
++number_of_lines;
}
Time times[number_of_lines];
double math[number_of_lines];
std::string input;
for(int loop=0;loop<number_of_lines;loop++){
std::getline(inputFile, input);
stid::istringstream(input) >> times[i].minutes >> times[i].hours >> math[i];
}
我需要帮助的一行是:
stid::istringstream(input) >> times[i].setTimeMinutes(//what goes here?) >> times[i].setTimeHours(//what goes here?) >> math[i];
当然,如果它甚至可以工作?谢谢!
答案 0 :(得分:1)
由于minutes
和hours
变量是私有的(绝对是个好主意),所以替换此行
stid::istringstream(input) >> times[i].minutes >> times[i].hours >> math[i];
有三行
int hh, mm;
stid::istringstream(input) >> hh >> mm >> math[i];
times[i] = Time(hh, mm);
应该有用。
另一种解决方案是让操作员>>
阅读Time
,如下所示:
std::istream& operator >>(std::istream &is, Time &t) {
int hh, mm;
is >> hh >> mm;
t = Time(hh, mm);
return is;
}
那么你就可以在一行中阅读 - 就像这样:
stid::istringstream(input) >> times[i] >> math[i];
答案 1 :(得分:1)
只需为Time
创建一个输入运算符,输入行就会变为
if (!(std::istringstream(input) >> std::skipws >> time[i])) {
// report input error
}
需要有趣的std::skipws
才能从临时const
获取对流std::istream&
}的非std::istringstream
引用,该临时const&
只能绑定到{std::istream
1}}(这是有效的,因为使用的输入操作符恰好是std::istream&
的成员并返回Time
)。
您只需为std::istream& operator>> (std::istream& in, Time& time) {
int value;
if (in >> value) {
time.setTimeMinutes(value);
}
return in;
}
类实现一个输入运算符,例如:
{{1}}
输入操作符可能看起来比这更复杂,但基本思路保持不变。
答案 2 :(得分:0)
您需要先读取临时对象:
int m;
int h;
std::istringstream(input) >> h >> m;
times[i].setTimeMinutes(h,m);
您的替代方案可能是创建另一个类或结构,并且有一个重载的运算符&gt;&gt;对于类/结构。