2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Перегрузка операций ввода-вывода в С++
Сообщение07.06.2009, 17:34 
Аватара пользователя
Помогите пожалуйста разобраться, почему вылетает такая программа:

класс коэфициентов
Код:
#include <iostream>
using namespace std;
class Koef 
{
   int koef;
public:
   Koef(int a=0);
   virtual ~Koef();
   friend ostream &operator <<(ostream &stream,const Koef b){
      stream<<b.koef;
      return stream;
   };
   friend istream &operator >>(istream &stream, Koef b){
      stream>>b.koef;
      return stream;
   };

};

Koef.cpp
Код:
Koef::Koef(int a)
{
   koef=a;
}
Koef::~Koef()
{

}

класс полиномов
Код:
#include "Koef.h"
#include <iostream>
using namespace std;
class Polinomial 
{
   Koef*poli;
   int n;
public:
   Polinomial();
   virtual ~Polinomial();
   friend ostream &operator <<(ostream &stream,const Polinomial X){
      for(int i=0;i<X.n;i++) stream<<X.poli[i]<<"^"<<i<<"+";
   return stream;
   }
   friend istream &operator >>(istream &stream, Polinomial X){
      cout<<"Input koef of polinom"<<endl;
      for(int i=0;i<X.n;i++) stream >> X.poli[i];
   
      return stream;
   }

};

Polinomial.cpp
Код:
Polinomial::Polinomial()
{
   cout<<"Input degree of polinom"<<endl;
   cin>>n;
   poli=new Koef[n];

}

Polinomial::~Polinomial()
{
   delete[]poli;
}

main
Код:
#include "Polinomial.h"
#include "Koef.h"
#include <iostream>
using namespace std;
void main(){
   Polinomial a;
   cin>>a;
   cout<<a;

}

 
 
 
 Re: Перегрузка операций ввода-вывода в С++
Сообщение07.06.2009, 18:01 
У Вас во всех операторах ввода-вывода второй операнд должен передаваться по ссылке, а не по значению (по крайней мере, во вводе совершенно точно). Хотя что именно понимается под "вылетает"? Симтомы? Опишите ситуацию...

 
 
 
 Re: Перегрузка операций ввода-вывода в С++
Сообщение07.06.2009, 18:06 
Аватара пользователя
EtCetera в сообщении #220401 писал(а):
У Вас во всех операторах ввода-вывода второй операнд должен передаваться по ссылке, а не по значению (по крайней мере, во вводе совершенно точно).

Большое спасибо!!!!

 
 
 
 Re: Перегрузка операций ввода-вывода в С++
Сообщение09.06.2009, 13:33 
Аватара пользователя
Что-то я не могу понять откуда взялась такая ошибка: error C2065: 'NOD' : undeclared identifier

класс коэфициентов
Код:
#include <iostream>
using namespace std;
class Koef 
{
   int koef;
public:
   Koef(int a=0);
   Koef(const Koef&X);
   virtual ~Koef();
   Koef operator *(const Koef b);
   Koef operator +(const Koef b);
   Koef operator /(const Koef b);
   Koef operator -(const Koef b);
   Koef operator =(const Koef b);
   bool operator !=(const Koef b);
   bool operator >(const Koef b);
   friend ostream &operator <<(ostream &stream,const Koef &b){
      stream<<b.koef;
      return stream;
   };
   friend istream &operator >>(istream &stream, Koef &b){
      stream>>b.koef;
      return stream;
   };

};

Koef.cpp
Код:
Koef::Koef(int a)
{
   koef=a;
}
Koef::Koef( const Koef&X){
   koef=X.koef;
}
Koef::~Koef()
{

}
Koef Koef:: operator*(const Koef b){
   return koef*b.koef;
}
Koef Koef::operator +(const Koef b){
   return koef+b.koef;
}
Koef Koef::operator /(const Koef b){
   return koef/b.koef;
}
Koef Koef::operator -(const Koef b){
   return koef-b.koef;
}
Koef Koef::operator =(const Koef b){
   koef=b.koef;
   return *this;
}
bool Koef::operator !=(const Koef b){
   if(koef!=b.koef) return true;
   else return false;
}
bool Koef::operator >(const Koef b){
   if(koef>b.koef) return true;
   else return false;
}

класс полиномов
Код:
#include "Koef.h"
#include <iostream>
using namespace std;
class Polynom 
{
   Koef*poli;
   int n;
public:
   Polynom();
   Polynom(int newsize);
   Polynom (const Polynom &X);
   virtual ~Polynom();
   Polynom operator +(const Polynom &X);
   Polynom operator =(const Polynom &X);
   Polynom operator *(const Polynom &X);
   Polynom operator -(const Polynom &X);
   bool operator !=(const Polynom &X);
   bool operator >(const Polynom &X);
   Polynom NOD(Polynom &X, Polynom &Y);
   friend ostream &operator <<(ostream &stream,const Polynom &X){
      for(int i=0;i<X.n;i++) stream<<X.poli[i]<<"t^"<<i<<"+";
   return stream;
   }
   friend istream &operator >>(istream &stream, Polynom &X){
      cout<<"Input koef of polinom"<<endl;
      for(int i=0;i<X.n;i++) stream >> X.poli[i];
      return stream;
   }
   
};

Polinomial.cpp
Код:
Polynom::Polynom(){
   cout<<"Input degree of polinom"<<endl;
   cin>>n;
   poli=new Koef[n];
}
//////////////////////////////////////////////////////////////////////
Polynom::Polynom(int newsize){
   n=newsize;
   poli=new Koef[n];
   for(int i=0;i<n;i++) poli[i]=0;
}
//////////////////////////////////////////////////////////////////////
Polynom::Polynom(const Polynom &X){
   n=X.n;
   poli=new Koef[n];
   for(int i=0;i<n;i++) poli[i]=X.poli[i];
}
//////////////////////////////////////////////////////////////////////
Polynom::~Polynom()
{
   delete[]poli;
}
//////////////////////////////////////////////////////////////////////
Polynom Polynom::operator +(const Polynom &X){
   if(n<=X.n){
      Polynom sum(X.n);
      Polynom poli1(X.n);
      for(int i=0;i<n;i++) poli1.poli[i]=poli[i];
      for(int j=0;j<X.n;j++) sum.poli[j]=X.poli[j]+poli1.poli[j];
      return sum;
   }
   if(n>X.n){
      Polynom sum(n);
      Polynom poli1(n);
      for(int i=0;i<X.n;i++) poli1.poli[i]=X.poli[i];
      for(int j=0;j<n;j++) sum.poli[j]=poli[j]+poli1.poli[j];
      return sum;
   }
   
}
//////////////////////////////////////////////////////////////////////
Polynom Polynom::operator =(const Polynom &X){
   n=X.n;
   poli=new Koef[n];
   for(int i=0;i<n;i++) poli[i]=X.poli[i];
   return *this;
}
//////////////////////////////////////////////////////////////////////
Polynom Polynom::operator *(const Polynom &X){
   Polynom product(n+X.n-1);
   for(int i=0;i<X.n;i++){
      for(int j=0;j<n;j++){
         product.poli[i+j]=product.poli[i+j]+poli[j]*X.poli[i];
      }
   }
   return product;
}
//////////////////////////////////////////////////////////////////////

Polynom Polynom ::operator -(const Polynom &X){
   if(n<=X.n){
      Polynom sum(X.n);
      Polynom poli1(X.n);
      for(int i=0;i<n;i++) poli1.poli[i]=poli[i];
      for(int j=0;j<X.n;j++) sum.poli[j]=X.poli[j]-poli1.poli[j];
      return sum;
   }
   if(n>X.n){
      Polynom sum(n);
      Polynom poli1(n);
      for(int i=0;i<X.n;i++) poli1.poli[i]=X.poli[i];
      for(int j=0;j<n;j++) sum.poli[j]=poli[j]-poli1.poli[j];
      return sum;
   }
   return *this;
}
//////////////////////////////////////////////////////////////////////
bool Polynom::operator !=(const Polynom &X){
   if(n!=X.n) return true;
   else{
      for(int i=0;i<n+X.n;i++){
         if(poli[i]!=X.poli[i]) return true;
         else return false;
      }
   }
}
//////////////////////////////////////////////////////////////////////
bool Polynom::operator >(const Polynom &X){
   if(n>X.n && poli[n]!=0) return true;
   else{
      for(int i=0;i<n+X.n;i++){
         if(poli[i]>X.poli[i]) return true;
         else return false;
      }
   }
}

//////////////////////////////////////////////////////////////////////
Polynom Polynom::NOD(Polynom &X, Polynom &Y){
   while(X!=Y){
      if(X>Y) X=X-Y;
      else Y=Y-X;
   }
   return X;

}

main
Код:
#include "Polinomial.h"
#include "Koef.h"
#include <iostream>
using namespace std;
void main(){
   Polynom a;
   cin>>a;
   cout<<a<<endl;
   Polynom b;
   cin>>b;
   cout<<b<<endl;
   Polynom result1(0);
   result1=a+b;
   cout<<"Sum of polynoms"<<endl<<result1<<endl;
   Polynom result2(0);
   result2=a*b;
   cout<<"Product of polynoms"<<endl<<result2<<endl;
   Polynom result3(0);
   result3=a-b;
   cout<<"Difference of polynoms"<<endl<<result3<<endl;
   Polynom result4(0);
   result4=NOD(a,b);
   cout<<"The greatest general divider"<<endl<<result4<<endl;

}

 
 
 
 Re: Перегрузка операций ввода-вывода в С++
Сообщение09.06.2009, 15:45 
Ваша функция NOD - член класса Polynom, поэтому вызываться может лишь при упоминании самого класса: Polynom::NOD. Такое вызов будет доступен, если объявить функцию статической: вписать слово static перед объявлением функции в заголовочном файле (в данном случае ее следует сделать статической, т.к. обычный вызов через точку бессмысленен - в функции два равноправных параметра-объекта класса). Кстати, при нахождении НОД несколько негуманно изменять объекты - входные параметры.

 
 
 
 Re: Перегрузка операций ввода-вывода в С++
Сообщение09.06.2009, 15:52 
Аватара пользователя
EtCetera
И снова спасибо!

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group