2013-04-05 2 views
0

Я довольно новичок в C++, и я пытаюсь заставить istream работать. У меня есть класс:istream Необработанное исключение, переполнение стека

class rat 
{ 
private: 
    int num; 
    int denom; 
public: 

    rat(); 
    rat(const int&, const int&); 
    rat(const int&); 

    friend ostream& operator << (ostream&, const rat&); 
    friend istream& operator >> (istream&, const rat&); 
}; 
rat::rat(void) 
{ 
    num = 0; 
    denom = 1; 
} 

rat::rat(const int &n, const int &d) 
{ 
    num = n; 
    denom = d; 
    simplify(); 
} 

rat::rat(const int &n) 
{ 
    num = n; 
    denom = 1; 
} 

ostream& operator << (ostream &os, const rat &r1) 
{ 
    os << r1.num; 
    os << "/"; 
    os << r1.denom; 
    return os; 
} 

istream& operator >> (istream &is, const rat &r1) 
{ 
    is >> r1.num; 
    is >> r1.denom; 
    return is; 
} 

У меня также есть .cpp из:

#include <iostream> 
#include <conio.h> 
using namespace std; 
#include "Rats.h" 

void main() 
{ 
    rat r1(3,4), r2(2,3), r3; 


    system("cls"); 
    cout << "Please enter a rational number: "; 
    cin >> r3; 
} 

Моя проблема возникает, когда речь идет через "является >> r1.num;" линия. Это дает мне ошибку: Необработанное исключение в 0x772d15de в RatClass.exe: 0xC00000FD: переполнение стека.

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

ответ

0

Похоже, что вы принимаете const rat &r1, но, отправив данные из istream, вы будете менять r1. Вы не можете изменять константы. Не уверен, что это проблема, но это первая очевидная вещь, которая пришла на ум.

Попробуйте это:

istream& operator >> (istream &is, rat &r1) 
{ 
    is >> r1.num; 
    is >> r1.denom; 
    return is; 
} 

Не забудьте изменить свое определение в классе:

friend istream& operator >> (istream&, rat&);