<< Оператор Переписать, чтобы cout int и double значения
Мне нужно переписать оператор <<, чтобы он мог указывать значения для часа (int) и температуры (double).
Я думаю, что я включил все необходимые разделы. Заранее спасибо.
struct Reading {
int hour;
double temperature;
Reading(int h, double t): hour(h), temperature(t) { }
bool operator<(const Reading &r) const;
};
========
ostream& operator<<(ostream& ost, const Reading &r)
{
// unsure what to enter here
return ost;
}
========
vector<Reading> get_temps()
{
// stub version
cout << "Please enter name of input file name: ";
string name;
cin >> name;
ifstream ist(name.c_str());
if(!ist) error("can't open input file ", name);
vector<Reading> temps;
int hour;
double temperature;
while (ist >> hour >> temperature){
if (hour <0 || 23 <hour) error("hour out of range");
temps.push_back( Reading(hour,temperature));
}
}
7 ответов
Например, вот так:
bool operator <(Reading const& left, Reading const& right)
{
return left.temperature < right.temperature;
}
И это должна быть глобальная функция (или в том же пространстве имен, что и Reading
), а не член или Reading
, он должен быть объявлен как friend
если вы собираетесь иметь каких-либо защищенных или частных членов. Это можно сделать так:
struct Reading {
int hour;
double temperature;
Reading(int h, double t): hour(h), temperature(t) { }
friend bool operator <(Reading const& left, Reading const& right);
};
IIRC, вы можете сделать это одним из двух способов...
// overload operator<
bool operator< ( const Reading & lhs, const Reading & rhs )
{
return lhs.temperature < rhs.temperature;
}
или, вы можете добавить оператор в вашу структуру...
struct Reading {
int hour;
double temperature;
Reading ( int h, double t ) : hour ( h ), temperature ( t ) { }
bool operator< ( const Reading & other ) { return temperature < other.temperature; }
}
Вы, вероятно, хотите что-то вроде
ost << r.hour << ' ' << r.temperature;
Это довольно простая вещь, и если это не имеет смысла, вам стоит поговорить с кем-нибудь или взять книгу.
И если это все еще не имеет смысла, или вы не можете быть обеспокоены, подумайте о выборе другого хобби / карьеры.
r.hour()
r.temperature()
Вы объявили hour
а также temperature
как член поля Reading
, не член методы. Таким образом, они просто r.hour
а также r.temperature
(нет ()
).
Используйте параметр ost, такой как std::cout, в операторе<<.
Вы можете перегрузить такой оператор в C++.
struct Reading {
int hour;
double temperature;
Reading(int h, double t): hour(h), temperature(t) { }
bool operator<(struct Reading &other) {
//do your comparisons between this and other and return a value
}
}
Поскольку часы и температура являются переменными, а не функциями, просто удалите задний ()
от operator<<
функции.