对具有父类的子类的运算符 = 的操作
Operation on Operator= of a child class with a parent class
我正在做一项作业,创建一个多项式计算器,可以执行加法、减法、乘法和除法。当我使用提供的 main.cpp 来测试 operator= 函数时,编译器一直说:"没有找到采用类型为'多项式'的右操作数的运算符。
这是我收到的错误:
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++ projectcomp2012_assignment_3comp2012_assignment_3IntegerPolynomial.h(44):
could be 'IntegerPolynomial &IntegerPolynomial::operator =(const IntegerPolynomial &)'
while trying to match the argument list '(IntegerPolynomial, Polynomial)'
以下是我代码的一部分:
主.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;
}
多项式
#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
多项式.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;
}
整数多项式.h
#ifndef INTEGERPOLYNOMIAL_H
#define INTEGERPOLYNOMIAL_H
#include <iostream>
#include "Polynomial.h"
using namespace std;
class IntegerPolynomial : public Polynomial{
public:
// Default constructor
IntegerPolynomial();
);
#endif
整数多项式.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();
}
注意:我尝试只包含与问题相关的代码部分,因为我的代码的整个文件太长了。
问题到底是什么,因为主要是.cpp
d=b;
cout << "d=b=" << d << endl;
d=ib;
cout << "d=ib=" << d << endl;
工作正常。
这条线出现了问题。
id=b;
是否存在与函数定义相关的任何问题以及解决方案是什么。多谢。
问题是赋值运算符并没有真正继承 - 如果一个类没有声明赋值运算符,编译器会隐式声明一个(参见 [over.ass])。类 X
的隐式声明复制赋值运算符具有签名X& operator= (const X&)
。
因此,您的代码id = b
调用 IntegerPolynomial
的(隐式声明的)赋值运算符,该运算符期望右侧出现另一个IntegerPolynomial
。
如果需要将任意 Polynomial
s 赋值到 IntegerPolynomial
s,则必须显式定义这样的赋值运算符。我认为无论如何你都必须这样做:你如何一般地将一个一般多项式分配给一个积分多项式?
您的Polynomial::operator=
是私有的,它应该是:
class Polynomial
{
public:
Polynomial& operator=(const Polynomial& a);
protected:
std::list<Term> polyList;
};
相关文章:
- 在 c++ 中对字符串进行操作的关系运算符无法按预期工作
- 余数运算符的等效操作,用于处理低于允许的最小值
- 运算符 << 操作加载的 API for std::endl?
- 如何通过使用 2 位或更多数字的 XOR 运算符来执行此操作C++问题
- 操作后通过运算符分配对象
- 使用">"运算符增强语义操作
- 如何让迭代器使用赋值运算符对列表进行操作
- 为什么为单个赋值操作调用复制构造函数和重载赋值运算符
- 从文件中读取运算符并执行操作C++
- c++操作1运算符、操作2的未知值
- 使用重载运算符在函数调用时执行操作
- C++功能运算符结构不执行任何操作
- 对具有父类的子类的运算符 = 的操作
- isSet() 或运算符 void*() 或显式操作程序 bool() 或其他东西
- 在我的Matrix4类中使用某些用户定义的运算符的操作正在返回高值的高值
- 位字段操作中的运算符[] 重载?
- 在c++中操作重载赋值运算符
- 由于某种原因,使用 OR 运算符执行操作不起作用
- 在将对象传递给函数时,我必须重载哪些运算符才能查看所有操作
- 使结构体的所有数学运算符操作同一成员