Перегрузка оператора поможет? - PullRequest
0 голосов
/ 20 октября 2011

Как всегда, я довольно новичок в C ++, и я еще не совсем знаком с языком, поэтому я прошу прощения за то, что я звучал неопределенно заранее!

Моя проблема в том, что я изо всех сил пытаюсь понять, почему мой цикл while, кажется, останавливает остальные мои методы в моей перегруженной функции оператора;

#include "sample.h"

#include <iostream>
#include <vector>
#include <cstdlib>

using namespace std;

sample::sample(vector<double> doubles){}

sample::sample() {}

ostream& operator<< (ostream &out, sample &sample)
{
    out << "<" << sample.n << ":";
    return out;
}

istream& operator>> (istream &in, sample &sample)
{
    char firstChar;
    in >> firstChar;

    if(firstChar != '<'){
        cout << "You've not entered the data in a valid format,please try again!1 \n";
        exit(1);
    }

    int n;
    in >> n;
    sample.n = n;

    char nextChar;
    in >> nextChar;
    if(nextChar != ':'){
        cout << "You've not entered the data in a valid format,please try again!2 \n";
        exit(1);
    }

    vector<double> doubles;
    double number;
    while (in >> number){
        doubles.push_back(number);
        cout << in << " " << number;
    }
    in >> lastChar;

    return in;
}

int main(void)
{
    sample s;
    while (cin >> s){
        cout << s << "\n";
    }

    if (cin.bad())
      cerr << "\nBad input\n\n";

    return 0;
}

Мой ввод будет выглядеть примерно так:

<6: 10.3 50 69.9>

Я пытаюсь получить все двойные числа после «:» в векторе, что я могу сделать, если они целые, но один раз в ».'вводится, кажется, что он останавливается.

Если я вставляю только целые числа, он также останавливается после того, как while(in >> number) завершил поиск всех чисел, что хорошо, но команда cout<< в моей основной функциине похоже на работу!

Где я ошибся?

Ответы [ 2 ]

1 голос
/ 20 октября 2011

Вы должны подчиняться стандартным идиомам потока: каждый поток неявно преобразуется в bool (или указатель void), чтобы позволить проверку типа if (in >> n), чтобы увидеть, была ли операция выполнена успешно.Поэтому, прежде всего, вы должны убедиться, что ваш оператор соответствует этому (гарантируя, что поток «хорош», если извлечение прошло успешно).

Во-вторых, когда вы пишете цикл типа while (in >> x) { /*...*/ }, тогдапосле завершения цикла вы уже знаете, что ваш поток больше не работает.Таким образом, вам придется вызвать clear(), прежде чем вернуть его.

Может быть что-то вроде этого:

std::istream& operator>> (std::istream &in, sample &sample)
{
  char   c;
  int    n;
  double d;
  std::vector<double> vd;

  if (!(in >> c)) { return in; }                             // input error
  if (c != '>')   { in.setstate(std::ios::bad); return in; } // format error

  if (!(in >> n)) { return in; }                             // input error

  if (!(in >> c)) { return in; }                             // input error
  if (c != ':')   { in.setstate(std::ios::bad); return in; } // format error

  while (in >> d)
  {
    vd.push_back(d);
  }

  in.clear();

  if (!(in >> c)) { return in; }                             // input error
  if (c != '>')   { in.setstate(std::ios::bad); return in; } // format error

  state.n = n;
  state.data.swap(vd);

  return in;
}

Обратите внимание, что мы модифицируем объект sample только если весь вводоперация прошла успешно.

0 голосов
/ 20 октября 2011
cout << in << " " << number;

Вы, вероятно, имели в виду

cout << " " << number;

или что-то

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...