<< Оператор Переписать, чтобы 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<< функции.

Другие вопросы по тегам