2016-07-06 6 views
-2

Привет, ребята, я пытаюсь перегрузить ifstream и ofstream, но без каких-либо успехов.C++ ifstream и поток перегрузки оператора чтения из файла

Заголовочный файл:

#include <iostream> 
#include <fstream> 

using namespace std; 

class Complex 
{ 
    private: 
     double real; 
     double imaginary; 
    public: 
     //constructors 
     Complex(); 
     Complex(double newreal, double newimaginary); 
     ~Complex(); 
     //setter 
     void setReal(double newreal); 
     void setImaginary(double newimaginary); 
     //getter 
     double getReal(); 
     double getImaginary(); 
     //print 
     void print(); 
     //methods 
     Complex conjugate(); 
     Complex add(Complex c2); 
     Complex subtraction(Complex c2); 
     Complex division(Complex c2); 
     Complex multiplication(Complex c2); 

friend ifstream& operator >> (ifstream& in, Complex &c1) 
{ 

    in >> c1; 

    return in; 
} 

}; 

Тестовый файл:

#include <iostream> 
#include <fstream> 
#include <string> 
#include "Complex2.h" 

using namespace std; 

int main() 
{ 
    Complex c1; 

    ifstream infile; 
    infile.open("in1.txt"); 

    cout << "Reading from the file" << endl; 
    infile >> c1; 

    // write the data at the screen. 
    infile.close(); 

    return 0; 
} 

Я не думаю, что файл каст был важен, так как файл заголовка содержит ifstream.

Everytime я запустить эту программу, я получаю эту ошибку:

Reading from the file 
Segmentation fault (core dumped) 

Я не знаю, как это исправить.

спасибо.

+1

'in >> c1;' просто рекурсивно вызывается для определения функции оператора до тех пор, пока не исчерпается стек. –

ответ

2
friend ifstream& operator >> (ifstream& in, Complex &c1) 
{ 
    in >> c1; // This is calling this function infinitely!! 

    return in; 
} 

Приведенный выше код реализует operator>> для Complex типа. Однако это рекурсивная функция без условия остановки.

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

friend ifstream& operator >> (ifstream& in, Complex &c1) 
{ 
    double real; 
    in >> real; 
    c1.setReal(real); 

    double imaginary; 
    in >> imaginary; 
    c1.setImaginary(imaginary); 

    return in; 
} 

я проглядел, что это функция друга так, это может также работать.

friend ifstream& operator >> (ifstream& in, Complex &c1) 
{ 
    in >> c1.real; 
    in >> c1.imaginary; 

    return in; 
} 
+0

Я бы предпочел инкапсуляцию для анализа личных данных. Вероятно, это должно быть сделано с помощью функции класса private. –

+0

@ πάνταῥεῖ Никаких аргументов здесь, +1. –

1

Как уже упоминалось в моем комментарии, а в другой ответ перегрузка operator>>() просто вызывается рекурсивно.


Одним из наиболее распространенных подходов, чтобы исправить это, чтобы объявить put() функцию в Complex классе, как:

class Complex { 
public: 
    // ... 
private: 
    double real; 
    double imaginary; 
    istream& put(std::istream& is) { 
     is >> real; 
     is >> imaginary; 
     return is; 
    } 
}; 

И пусть глобальное OverLoad вызова этой функции:

friend ifstream& operator >> (ifstream& in, Complex &c1) { 
    return c1.put(in); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^