c++ - 多项式类实现的实现

标签 c++

我有以下代码来实现多项式类的ADT

#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;
}

但是 node 在 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;

}

引用有问题请告诉我哪里出了问题? 错误

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 ==========

我已经更新了代码

#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;
}

错误是

>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 ==========

最佳答案

classstruct 声明以“;”结尾。

#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;
}

以上是应该编译的代码的固定版本。不过,您的设计可以进行一些改进。一些建议:

  • 了解三巨头规则(复制构造函数、复制赋值运算符和析构函数)
  • 不要从类模板开始(如果您只是开始使用 C++ 编程)
  • 初始化列表
  • 在测试程序中using namespace std;是可以的,但是你必须了解命名空间污染
  • 如果您执行new,您需要在某处执行delete(而new ...[] 需要delete [ ] ...) 否则你会泄漏内存
  • 您的代码没有使用 iostreamcstdlib 中的任何内容。为什么要保留它们?
  • 您的 friend op+ 中不需要两个 for 循环

关于c++ - 多项式类实现的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3646458/

相关文章:

c++ - 尝试在 C++ 应用程序中更改 Ubuntu 14.04 中的实时时钟,得到 "Operation not permitted"

c++ - 为什么 shared_ptr 没有虚拟析构函数? (我该如何解决这个问题?)

c++ - Opencv C++ : How to split video several part by time?

c++ - 在 std::map 中使用结构作为值时出现运行时错误?

c++ - 关于 C++ 中的头文件创建错误

c++ - LabWindows 中内置的 Tcl 的 C 扩展在升级到 Tcl 8.6 后崩溃

python - 同时运行 c++ 和 python 脚本会导致问题

c++ - 如何在 C++ 中从 bytearray 中提取字节时交换 64 位整数?

c++ - 写入远程 Windows 共享文件夹的所有者时,GetNamedSecurityInfo 返回 ERROR_ACCESS_DENIED(5)

c++ - 显式删除和新建 vs 使用 unique_ptr