не ждет ввода с клавиатуры (перегружен оператор входного потока) в C ++ - PullRequest
1 голос
/ 03 марта 2010

Просто быстрый вопрос.

Я разработал следующий код:

#pragma once

#include <iostream>
using namespace std;

class Percent
{
public:
    friend bool operator ==(const Percent& first,
                                const Percent& second);
    friend bool operator <(const Percent& first,
                                const Percent& second);
    friend Percent operator +(const Percent& first, const Percent& second);
    friend Percent operator -(const Percent& first, const Percent& second);
    friend Percent operator *(const Percent& first, const int int_value);
    Percent();
    Percent(int percent_value);
    friend istream& operator >>(istream& ins,
                                Percent& the_object);
    //Overloads the >> operator to the input values of type
    //Percent.
    //Precondition: If ins is a file stream, then ins
    //has already been connected to a file.

    friend ostream& operator <<(ostream& outs,
                                    const Percent& a_percent);
    //Overloads the << operator for output values of type
    //Percent.
    //Precondition: If outs if a file stream, then
    //outs has already been connected to a file.
private:
    int value;
};

И это реализация:

// [Ed.: irrelevant code omitted]

istream& operator >>(istream& ins, Percent& the_object)
{
    ins >> the_object.value;
    return ins;
}

ostream& operator <<(ostream& outs, const Percent& a_percent)
{
    outs << a_percent.value << '%';
    return outs;
}

Проблема в том, что когда я пытаюсь выполнить какой-либо ввод с использованием оператора перегруженного потока ввода, программа не ожидает ввода после ввода одного значения - в последовательности входов. Другими словами, это моя основная функция:

#include "stdafx.h"
#include "Percent.h"
#include <iostream>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    cout << "Please input two percent values and an integer value: ";
    Percent first, second;
    int int_value;
    cin >> first;
    cin >> second;
    cout << "The first percent added to the second percent is: "
         << first + second << endl;
    cout << "The first percent subtracted from the second is: "
         << second - first << endl;
    cout << "The first multiplied by the integer value is: "
         << first * int_value << endl;
    return 0;
}

Он просто пропускает их, и переменные получают присвоенные значения, как будто они не были инициализированы - кроме первой переменной, которая действительно получает значение.

Мой вопрос: как мне предотвратить это поведение?

Ответы [ 3 ]

2 голосов
/ 03 марта 2010

Общая проблема с потоком ввода, особенно в Visual C ++, заключается в том, что вам нужен .ignore (). Это предотвратит игнорирование ввода. Если я правильно помню, просто сделайте cin.ignore () прямо перед (или после) первого cin. Я думаю, что это должно сделать.

0 голосов
/ 03 марта 2010

Я думаю, что это был я, потому что я вводил проценты, когда я должен был вводить целое число, которое объясняет, почему оно работало должным образом на компиляторе Андрея - также я не читал знак процента, который, я думаю, не был помогает.

Все входные и выходные данные должны сопровождаться знаком процента.

0 голосов
/ 03 марта 2010

У меня все работало правильно (просто скопировал ваш код), за исключением того, что последний cout << выдал ошибку, поскольку int_value не было инициализировано </p>

...