2012-12-05 51 views
0

我正在創建可以執行加法,減法,乘法和除法的多項式計算器的賦值。當我使用,只要測試操作者=函數main.cpp中,編譯器一直說:「沒有操作人的發現,其採用類型的右邊的操作數‘多項式’操作符=運算符=子類父類

以下是錯誤我接收:

下面
main.cpp(61): error C2679: binary '=' : no operator found which takes a right-hand 
operand of type 'Polynomial' (or there is no acceptable conversion) 
      c:\c++ project\comp2012_assignment_3\comp2012_assignment_3\IntegerPolynomial.h(44): 
      could be 'IntegerPolynomial &IntegerPolynomial::operator =(const IntegerPolynomial &)' 
      while trying to match the argument list '(IntegerPolynomial, Polynomial)' 

是我的代碼部分:

的main.cpp

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <cstdlib> 
#include <cmath> 
#include <string> 
#include "Polynomial.h" 
#include "IntegerPolynomial.h" 

using namespace std; 

template <typename T> 
T readPoly(const char* filename) { 
    ifstream fin(filename, ifstream::in); 
    T temp; 
    fin >> temp; 
    fin.close(); 
    return (temp); 
} 
int main(void) 
{ 
    Polynomial a = readPoly<Polynomial>("input1.txt"); 
    Polynomial b = readPoly<Polynomial>("input2.txt"); 
    Polynomial d; 

    b.sort(); 
    cout << "sorted b=" << b << endl; 

    IntegerPolynomial ia = readPoly<IntegerPolynomial>("input1.txt"); 
    IntegerPolynomial ib = readPoly<IntegerPolynomial>("input2.txt"); 

    int iarry[5] = {1, 3, 5, 9, 10}; 
    IntegerPolynomial id(iarry, 5); 

    cout << "ia=" << ia <<endl; 
    cout << "ib=" << ib <<endl; 
    cout << "id=" << id <<endl; 

    d=b; 
    cout << "d=b=" << d << endl; 
    d=ib; 
    cout << "d=ib=" << d << endl; 
    id=b; 
    cout << "id=b=" << id << endl; 
    d=a-b; 

    return 0; 
} 

polynomial.h

#ifndef POLYNOMIAL_H 
#define POLYNOMIAL_H 

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 
#include <list> 
#include <cstdlib> 
#include <cmath> 
using namespace std; 

class Polynomial 
{ 
    public: 
    Polynomial& operator=(const Polynomial& a); 
    protected: 
    std::list<Term> polyList; 
}; 
#endif 

polynomial.cpp

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <iomanip> 
#include <cstdlib> 
#include <cmath> 
#include <string> 
#include <list> 
#include "Polynomial.h" 
// Assignment operator 
Polynomial& Polynomial::operator=(const Polynomial& a) { 
    polyList.clear(); 
    for (std::list<Term>::const_iterator a_iterator = a.polyList.begin(), end = a.polyList.end(); a_iterator != end; ++a_iterator) { 
     const Term curr_Term = *a_iterator; 
     polyList.push_back(curr_Term); 
    } 
    return *this; 
} 

integerpolynomial.h

#ifndef INTEGERPOLYNOMIAL_H 
#define INTEGERPOLYNOMIAL_H 

#include <iostream> 
#include "Polynomial.h" 
using namespace std; 
class IntegerPolynomial : public Polynomial{ 
    public: 
    // Default constructor 
    IntegerPolynomial(); 
); 
#endif 

integerpolynomial.cpp

#include "IntegerPolynomial.h" 

using namespace std; 

// Default constructor 
IntegerPolynomial::IntegerPolynomial() { 
} 
// print the polynomial a in decreasing order of exponent 
void IntegerPolynomial::print(ostream& os) const { 
    os << toString(); 
} 

注:我想只包括代碼段這是關係到問題,因爲我的代碼的整個文件太長。

什麼是真正的問題,因爲在main.cpp中

d=b; 
cout << "d=b=" << d << endl; 
d=ib; 
cout << "d=ib=" << d << endl; 

工作正常。

此行出現問題。

id=b; 

是否存在與函數的定義相關的問題以及解決方案。非常感謝。

回答

0

的問題是,賦值運算符是不是真的繼承 - 如果一個類沒有聲明賦值運算符,編譯器聲明一個隱式(見[在。屁股])。類X的隱式聲明的複製分配操作符具有簽名X& operator= (const X&)

所以,你的代碼id = b調用的IntegerPolynomial的(隱含聲明)賦值操作符,它接受另一個IntegerPolynomial在右側。

如果您需要將任意Polynomial s分配到IntegerPolynomial s,則必須明確定義這樣的賦值運算符。無論如何,我認爲你必須這樣做:你如何一般性地將一般多項式分配給整數多項式?

+0

這與我一直在想的很接近,但這種情況下的解決方案是什麼?我應該用帶有** IntergerPolynomial **的參數列表來重載函數嗎? – hemantai

+0

@hemantai我編輯了答案 - 請參閱第3段。 – Angew

+0

好的,我明白了,讓我試着去做。 – hemantai

0

Polynomial::operator=是私有的,它應該是:

class Polynomial 
{ 
public: 
    Polynomial& operator=(const Polynomial& a); 
protected: 
    std::list<Term> polyList; 
}; 
+0

對不起,我已經公開了。我忘了複製'公衆:'。問題仍然存在。 – hemantai

相關問題