開發多項式類Polynomial,多項式的每一項用陣列或結構體表示,每項包含一個系數和一個指數。例如2x4的指數為4,系數為2。請開發一個完整的Polynomial類,包括建構式、解構式以及get函式和set函式。該類還要提供下述多載的運算子:
1)多載運算子“+”和“-”,將兩個多項式相加或相減。
2)多載乘法運算子“*”,將兩個多項式相乘。
3)多載賦值運算子“=”,將一個多項式賦給另外一個多項式。
#include<iostream>
#include<stdlib.h>
using namespace std;
struct Node
{
int coefficient;
int exponent;
Node *next;
};
class Polynomial
{
public:
Polynomial();
Polynomial(int len);
Polynomial(const Polynomial& old);
~Polynomial();
void get();
void set(int len);
Polynomial operator+(Polynomial &A);
Polynomial operator-(Polynomial &A);
Polynomial operator*(Polynomial &A);
Polynomial operator=(Polynomial &A);
private:
int length;
Node *first;//頭指標
void add(int a,int b);
void multiply (int a,int b);
};
Polynomial:: Polynomial()
{
first = 0;
length = 0;
}
Polynomial:: Polynomial(int len)
{
Node* node = new Node;
cin>>node->coefficient>>node->exponent;
node->next = 0;
first = node;
Node *p = first;
for(int i = 0;i<len-1;i++)
{
Node* node = new Node;
cin>>node->coefficient>>node->exponent;
node->next = 0;
p->next = node;
p = p->next;
}
length = len;
}
Polynomial:: Polynomial(const Polynomial &old)
{
if(old.first==0)
{
first = 0;
length = 0;
}
else
{
Node* q = old.first;
Node* node = new Node;
node->coefficient = q->coefficient;
node->exponent = q->exponent;
node->next = 0;
q = q->next;
first = node;
Node* p =first;
for(int i =0;i<old.length-1;i++)
{
Node* node = new Node;
node->coefficient = q->coefficient;
node->exponent = q->exponent;
node->next = 0;
p->next = node;
p = p->next;
q= q->next;
}
length = old.length;
}
}
Polynomial::~Polynomial()
{
Node* p =first;
while(first)
{
p = first->next;
free(first);
first = p;
}
length = 0;
}
Polynomial Polynomial::operator+(Polynomial &A)
{
Polynomial temp = (*this);
Node* p =A.first;
for(int i = 0;i<A.length;i++)
{
temp.add(p->coefficient,p->exponent);
p = p->next;
}
return temp;
}
Polynomial Polynomial::operator-(Polynomial &A)
{
Polynomial temp = (*this);
Node* p = A.first;
for(int i = 0;i<A.length;i++)
{
temp.add((-1)*p->coefficient,p->exponent);
p = p->next;
}
return temp;
}
Polynomial Polynomial::operator*(Polynomial &A)
{
Polynomial ret;
Node* p = A.first;
for(int i =0;i<A.length;i++)
{
Polynomial temp = (*this);
temp.multiply(p->coefficient,p->exponent);
p = p->next;
ret = ret + temp;
}
return ret;
}
void Polynomial::get()
{
Node* p =first;
cout<<p->coefficient<<"x^"<<p->exponent;
p = p->next;
char oper;
for(int i = 0;i<length - 1;i++)
{
oper = p->coefficient>0?'+':'-';
cout<<oper<<p->coefficient<<"x^"<<p->exponent;
p = p->next;
}
}
Polynomial Polynomial::operator=(Polynomial &A)
{
if(A.first==0)
{
first = 0;
length = 0;
}
else
{
Node* q = A.first;
Node* node = new Node;
node->coefficient = q->coefficient;
node->exponent = q->exponent;
node->next = 0;
q= q->next;
first = node;
Node* p =first;
for(int i =0;i<A.length-1;i++)
{
Node* node = new Node;
node->coefficient = q->coefficient;
node->exponent = q->exponent;
node->next = 0;
p->next = node;
p = p->next;
q = q->next;
}
length = A.length;
}
return *this;
}
void Polynomial::add(int a,int b)
{
if(first==0)
{
Node* node = new Node;
node->coefficient = a;
node->exponent = b;
node->next = 0;
first = node;
length++;
}
else if(b>first->exponent)
{
Node* node = new Node;
node->coefficient = a;
node->exponent = b;
node->next = first;
first = node;
length++;
}
else
{
Node* p =first;
for(int i = 0;i<length;i++)
{
if(p->exponent==b)
{
p->coefficient +=a;
break;
}
else if(b<p->exponent&&p->next&&b>p->next->exponent)
{
Node* node = new Node;
node->coefficient = a;
node->exponent = b;
node->next = p->next;
p->next = node;
length++;
break;
}
else if(b<p->exponent&&!p->next)
{
Node* node = new Node;
node->coefficient = a;
node->exponent = b;
node->next = 0;
p->next = node;
length++;
break;
}
else
p = p->next;
}
}
}
void Polynomial::multiply(int a,int b)
{
Node* p =first;
for(int i =0;i<length;i++)
{
p->coefficient*=a;
p->exponent+=b;
p= p->next;
}
}
int main()
{
Polynomial p1(4);
Polynomial p2(2);
cout<<"p1=";
}
編譯結果給我報了這個錯誤[Error] no match for 'operator=' (operand types are 'Polynomial' and 'Polynomial')
但是我的確定義了operator=函式,求debug,謝謝
問題出在operator*函式中的ret = ret + temp報錯
uj5u.com熱心網友回復:
暈,運算子多載都是回傳堆疊內區域變數,要知道,出了函式堆疊,區域變數就消亡了。uj5u.com熱心網友回復:
有復制沒關系
uj5u.com熱心網友回復:
測驗了一下,還真是沒問題,c編譯器也優化了,加入了記憶體逃逸分析
class A {
public:
A():n(0){printf("create...\n");}
A(int n):n(n){printf("create %d\n", n);}
//A(A &a):n(a.n) {printf("copy %d\n", a.n);}
A fn1() { //有回傳值,a區域變數逃逸出函式堆疊的作用域
A a(5);
printf("fn1: %p, %d\n", &a, a.n);
return a;
}
void fn2() { //無回傳值,a區域變數被釋放,無法逃逸
A a(5);
printf("fn2: %p, %d\n", &a, a.n);
}
A* fn3() { //有回傳值,指標型別無法逃逸
A a(5);
A *aa = &a;
printf("fn1: %p, %d\n", &a, a.n);
return aa;
}
~A() {printf("delete %d\n", n);}
int n;
};
int main(int argc, const char * argv[]) {
int a1 = 3;
A a2(10);
A a3 = a2.fn1(); //fn1的a區域變數的記憶體地址是main函式堆疊的a3的地址,說明物件區域變數能逃逸
A a4 = a2.fn1(); //fn1的a區域變數的記憶體地址是main函式堆疊的a4的地址,說明物件區域變數能逃逸
a2.fn2(); //fn2的a區域變數的記憶體地址是fn2堆疊內地址,因為沒有回傳值,所以物件區域變數無法逃逸
a2.fn2(); //fn2的a區域變數的記憶體地址是fn2堆疊內地址,因為沒有回傳值,所以物件區域變數無法逃逸(執行兩次是為了確認堆疊內區域變數地址沒變)
A *a5 = a2.fn3(); //fn3的a區域變數的記憶體地址是fn3堆疊內地址, a5指向的是fn3堆疊內變數的地址,說明指標不能逃逸
printf("%p, %p, %p, %p, %p, %d\n", &a1, &a2, &a3, &a4, a5, a3.n);
return 0;
}
uj5u.com熱心網友回復:
operator+ -=*/ 的引數改成const T& 而不是 T&operator= 回傳值最好是T& ,不是T
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/97365.html
標籤:C++ 語言
上一篇:lcd1602。求教怎么撰寫
下一篇:QT中的錯誤:
