2010-09-05 4 views
0

i ont code suivant pour mettre en œuvre ADT de la classe polynimialmise en œuvre de la mise en œuvre de la classe polynimial

#include <iostream> 
#include <cstdlib> 
using namespace std; 
template<class Number> 
class POLY 
{ 
public: 
    int n; 
    Number *a; 
public: 
    POLY<Number>(Number c,int N){ 

     a=new Number[N+1]; 
      n=N+1; 
      a[N]=c; 
      for (int i=0;i<N;i++) a[i]=0; 
       } 
    float eval(float x) const { 

     double t=0.0; 
      for (int i=n-1;i>=0;i--) 
       t=t*x+a[i]; 
      return t; 


    } 


    friend POLY operator+(POLY &p,POLY&q){ 
     friend POLY operator+(POLY &p,POLY&q){ 

POLY t(0,p.n>q.n?p.n-1:q.n-1); 
      for (int i=0;i<p.n;i++) 
t.a[i]+=p.a[i]; 
for (int j=0;j<q.n;j++) 
    t.a[j]+=q.a[j]; 

    return t; 

} 



    } 
    friend POLY operator+(POLY &p,POLY&q){ 



    } 

} 


int main(){ 






    return 0; 
} 

mais ne fonctionne de noeud suivant pragment

friend POLY operator+(POLY &p,POLY&q){ 

POLY t(0,p.n>q.n?p.n-1:q.n-1); 
      for (int i=0;i<p.n;i++) 
t.a[i]+=p.a[i]; 
for (int j=0;j<q.n;j++) 
    t.a[j]+=q.a[j]; 

    return t; 

} 

il a un problème de référence s'il vous plaît dites-moi ce qui est faux? erreurs

1>------ Build started: Project: polynomial, Configuration: Debug Win32 ------ 
1>Build started 9/5/2010 6:00:34 PM. 
1>PrepareForBuild: 
1> Creating directory "c:\users\david\documents\visual studio 2010\Projects\polynomial\Debug\". 
1>InitializeBuildStatus: 
1> Creating "Debug\polynomial.unsuccessfulbuild" because "AlwaysCreate" was specified. 
1>ClCompile: 
1> polynomial.cpp 
1>c:\users\david\documents\visual studio 2010\projects\polynomial\polynomial\polynomial.cpp(54): error C2143: syntax error : missing ';' before 'int' 
1>c:\users\david\documents\visual studio 2010\projects\polynomial\polynomial\polynomial.cpp(29): error C2270: '+' : modifiers not allowed on nonmember functions 
1>   c:\users\david\documents\visual studio 2010\projects\polynomial\polynomial\polynomial.cpp(54) : see reference to class template instantiation 'POLY<Number>' being compiled 
1>c:\users\david\documents\visual studio 2010\projects\polynomial\polynomial\polynomial.cpp(45): error C2270: '+' : modifiers not allowed on nonmember functions 
1> 
1>Build FAILED. 
1> 
1>Time Elapsed 00:00:01.36 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

i ont code mis à jour

#include <iostream> 
#include <cstdlib> 
#include <ostream> 
using namespace std; 

template<class Number> 
class POLY 
{ 
public: 
    int n; 
    Number *a; 
public: 
    POLY(Number c,int N){ 
     a=new Number[N+1]; 
     n=N+1; 
     a[N]=c; 
     for (int i=0;i<N;i++) a[i]=0; 
    } 

    float eval(float x) const { 
     double t=0.0; 
     for (int i=n-1;i>=0;i--) 
      t=t*x+a[i]; 
     return t; 
    } 

    friend POLY operator+(POLY &p,POLY&q){ 

     POLY t(0,p.n>q.n?p.n-1:q.n-1); 
     for (int i=0;i<p.n;i++) 
      t.a[i]+=p.a[i]; 
     for (int j=0;j<q.n;j++) 
      t.a[j]+=q.a[j]; 
     return t; 
    } 
    friend POLY operator*(POLY &p,POLY & q){ 

     POLY t(0,(p.n-1)+(q.n-1)); 
       for (int i=0;i<p.n;i++) 
        for (int j=0;j<q.n;j++) 
          t.a[i+j]=p.a[i] * q.a[j]; 
       return t; 

    } 
}; 


int main(int argc,char *argv[]){ 
    float p=3.0f; 
    int n=10; 

    POLY<int> x(1, 1),one(1,0),t=x+one,y=t; 
    for (int i=0;i<n;i++) 
    { y=y*t; 
    cout<<y<<endl;} 
    cout<<y.eval(p)<<endl; 

    return 0; 
} 

erreurs sont

>c:\users\david\documents\visual studio 2010\projects\polynomial1\polynomial1\polynomial.cpp(55): error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'POLY<Number>' (or there is no acceptable conversion) 
1>   with 
1>   [ 
1>    Number=int 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(679): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(726): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(764): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const char *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(811): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,char)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(937): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const signed char *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(944): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,signed char)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(951): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const unsigned char *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(958): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,unsigned char)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(968): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>,POLY<Number>>(std::basic_ostream<_Elem,_Traits> &&,_Ty)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char>, 
1>    Number=int, 
1>    _Ty=POLY<int> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(1085): or  'std::basic_ostream<_Elem,_Traits> &std::operator <<<char,std::char_traits<char>>(std::basic_ostream<_Elem,_Traits> &,const std::error_code &)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(186): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ostream<_Elem,_Traits> &(__cdecl *)(std::basic_ostream<_Elem,_Traits> &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(192): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_ios<_Elem,_Traits> &(__cdecl *)(std::basic_ios<_Elem,_Traits> &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(199): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::ios_base &(__cdecl *)(std::ios_base &))' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(206): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::_Bool)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(226): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(short)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(260): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned short)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(280): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(int)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(305): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned int)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(325): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(345): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned long)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(366): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(__int64)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(386): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(unsigned __int64)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(407): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(float)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(427): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(double)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(447): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(long double)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(467): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(const void *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   c:\program files\microsoft visual studio 10.0\vc\include\ostream(487): or  'std::basic_ostream<_Elem,_Traits> &std::basic_ostream<_Elem,_Traits>::operator <<(std::basic_streambuf<_Elem,_Traits> *)' 
1>   with 
1>   [ 
1>    _Elem=char, 
1>    _Traits=std::char_traits<char> 
1>   ] 
1>   while trying to match the argument list '(std::ostream, POLY<Number>)' 
1>   with 
1>   [ 
1>    Number=int 
1>   ] 
1> 
1>Build FAILED. 
1> 
1>Time Elapsed 00:00:00.82 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

Votre code est-il complet? Pourquoi l'indentation géniale? Pourquoi avez-vous deux définitions 'opérateur +' EMPTY dans votre classe? Pourquoi la main VIDE? Pourquoi les opérandes de 'operator +' sont-ils non-const? – paercebal

+0

Vous avez deux définitions pour 'op +'? En outre, quel genre d'erreur rencontrez-vous - compiler le temps, l'éditeur de liens ou le temps d'exécution? – dirkgently

+0

je vais mettre à jour le code look – user439547

Répondre

2

class et struct déclarations se terminent par un ';'.

#include <iostream> 
#include <cstdlib> 

using namespace std; 

template<class Number> 
class POLY 
{ 
public: 
    int n; 
    Number *a; 
public: 
    POLY(Number c,int N){ 
     a=new Number[N+1]; 
     n=N+1; 
     a[N]=c; 
     for (int i=0;i<N;i++) a[i]=0; 
    } 

    float eval(float x) const { 
     double t=0.0; 
     for (int i=n-1;i>=0;i--) 
      t=t*x+a[i]; 
     return t; 
    } 

    friend POLY operator+(POLY &p,POLY&q){ 

     POLY t(0,p.n>q.n?p.n-1:q.n-1); 
     for (int i=0;i<p.n;i++) 
      t.a[i]+=p.a[i]; 
     for (int j=0;j<q.n;j++) 
      t.a[j]+=q.a[j]; 
     return t; 
    } 
}; 


int main(){ 
    POLY<int> p(5, 2); 
    return 0; 
} 

Ce qui précède est une version fixe de votre code qui doit être compilé. Votre conception pourrait utiliser une certaine amélioration si. Quelques suggestions:

  • En savoir plus sur la règle des Big Three (constructeur de copie, opérateur d'affectation copie et destructor)
  • Ne pas commencer avec un modèle de classe (si vous commencez seulement la programmation en C++)
  • Listes Initializer
  • Il est normal de using namespace std; dans un programme de test, mais vous devez savoir sur la pollution de l'espace de noms
  • Si vous faites un new vous avez besoin d'un endroit delete (et un new ...[] nécessite un delete [] ...) ou bien vous perdez de la mémoire
  • Votre code n'utilise rien du iostream ou du cstdlib. Pourquoi les garder alors?
  • Vous n'avez pas besoin de deux boucles for dans votre friend op+
+0

non il n'est pas corrigé si cela aide que j'utilise Visual C++ 2010 et les erreurs sont les mêmes – user439547

+0

Le code que j'ai posté se compile bien sur VS2010 et Comeau. Pouvez-vous essayer de le copier-coller dans la fenêtre de votre éditeur et de le créer? – dirkgently

2

Vous avez certainement trop de operator+() DEFINITIONS dans votre code:

friend POLY operator+(POLY &p,POLY&q){ 
    friend POLY operator+(POLY &p,POLY&q){ 
     [...] 
    } 
} 
friend POLY operator+(POLY &p,POLY&q){ 

} 

Évidemment, il ne devrait y avoir un d'entre eux.

Le « problème avec des références » vous mentionnez signifie probablement que vous devriez prendre les paramètres par const référence (et l'opérateur lui-même doit également être const):

POLY operator+(const POLY &p, const POLY &q) const { 
    [...] 
} 
0

Il semble que vous manque une surcharge operator<< pour votre classe poly. Vous voyez, cout << y ne fonctionne tout simplement pas comme par magie. Vous devez définir ce qui devrait arriver exactement ici.

Quelques autres suggestions:

  • Utilisez const chaque fois qu'il est logique.Par exemple, cela a beaucoup de sens pour operator+, operator* et operator<< comme qualificatif cv pour vos arguments de référence. Comme vous semblez apprendre le langage, il peut être très instructif d'apprendre à écrire un constructeur de copie, un opérateur d'assignation et un destructeur (en respectant le rule of three). Mais dans le code actuel, vous utiliserez probablement un vecteur comme membre qui rend la vie beaucoup plus facile car vous n'avez pratiquement rien à faire (définir vos propres fonctions membres).

Exemple:

template<class T> 
struct poly 
{ 
    std::vector<T> coeffs; 

    // default ctor 
    poly() {} 

    // conversion constructor (i.e. poly<int> --> poly<double> 
    template<class U> 
    poly(poly<U> const& p) 
    : coeffs(p.coeffs.begin(),p.coeffs.end()) {} 

    friend poly operator+(poly const& a, poly const& b) 
    { 
     ... 
    } 

    friend poly operator*(poly const& a, poly const& b) 
    { 
     ... 
    } 
}; 

template<class T> 
ostream& operator<<(ostream& os, poly<T> const& p) 
{ 
    .... 
    return os; 
} 

Il! Pas besoin de copie personnalisée ctor, opérateur d'affectation ou destructeur.