2重载运算符>>方法被调用

时间:2014-11-12 00:49:18

标签: c++

我有一个包含两个重载operator>>方法的Complex类,一个用于来自控制台的std::istream,另一个用于std::ifstream

std::istream& operator>>(std::istream& is, Complex& c) 
{

    int re, im;
    std::cout << "input the real-part of the complex" << std::endl;
    while ( ! (is >> re))
    {
        std::cout << "Please give me a double!  Try again: \n";
        is.clear();
        is.ignore(1000, '\n');
    }
    std::cout << "input the imaginary-part of the complex" << std::endl;
    while ( ! (is >> im))
    {
        std::cout << "Please give me a double!  Try again: \n";
        is.clear();
        is.ignore(1000, '\n');
    }
    c = Complex(re, im);
    return is;
}

std::ifstream& operator>>(std::ifstream& ifs, Complex& c) 
{
    int re, im;
    ifs >> re; ifs>> im;
    c = Complex(re,im);
    return ifs;
}

在我的程序中,我能够从控制台或文件中插入复数数组。为了简化插入,我创建了其他方法:

void insertArray(std::istream& is, Complex* arr, int size)
{
    for (int i = 0; i < size; ++i)
    {
        is >> arr[i];
    }
}

不幸的是,我注意到当使用std::ifstream对象作为参数调用此方法时,

std::ifstream ifs("complex.dat");
insertArray(ifs, x, size);

两个运营商&gt;&gt;调用方法,以便控制台包含其他输出,但是从文件中正确加载数据。结果显示在图像中。
console output
很容易注意到程序要求给定值,因为控制台缓冲区如何从文件缓冲区加载数据。

有没有办法处理它,除了用insertArray2而不是std::ifstream创建单独的方法std::istream

2 个答案:

答案 0 :(得分:2)

您可以考虑模板化insertArray

template<class T>
void insertArray(T& is, Complex* arr, int size)

答案 1 :(得分:2)

如果我理解你的问题,你可以写:

if ( &is == &std::cin )
    std::cout << "Please give me a double!  Try again: \n";

只有在使用std::cin调用函数时才会生成此输出。如果您在不同的fstreamsstream或其他任何地方使用该功能,则不会这样做。