重载 = 运算符时如何使用 THIS 指针
How to Use THIS pointer when Overloading = Operator
所以我让 += 运算符重载,试图利用我已经定义的 + 运算符。即多项式 + 多项式返回一个新的多项式。所以我的 += 函数基本上尝试调用这个 + 函数,LHS 为 *this,RHS 为 *this + B(其中 B 是通过常量引用传递给函数的多项式对象)。我收到错误。我哪里出错了?
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
using namespace std;
void line(int lines);
class Polynomial
{
private:
int degree;
double* coeffs;
public:
//constructors
Polynomial() {degree=0;coeffs=new double[1];}
Polynomial(int deg) {degree=deg;coeffs=new double[deg+1];}
Polynomial(const Polynomial& A);
//mutators
void GetCoeffs(istream& in);
void EditCoeff(int deg);
void ResetCoeffs();
int Coeff(int deg);
void Randomize(int max);
//accessors
void Show(ostream& out);
int Degree() {return degree;}
//operators
Polynomial operator+(const Polynomial& B); //Polynomial + Polynomial
friend Polynomial operator +(double c, Polynomial& A); //c + Polynomial
Polynomial operator +(double c); //Polynomial + c
void operator +=(const Polynomial& B); //Polynomial+=Polynomial
void operator =(Polynomial& A);
Polynomial operator*(int k);
Polynomial operator*(Polynomial& A);
};
int main()
{
Polynomial A(5);
A.Randomize(4);
A.Show(cout);
line(2);
Polynomial B=A+8;
B.Show(cout);
return 0;
}
Polynomial Polynomial::operator*(int k)
{
Polynomial C(degree);
C=*this;
for (int i=degree; i>=0; i--)
C.coeffs[i]*=k;
return C;
}
Polynomial operator +(double c, Polynomial& A)
{
Polynomial C=A;
C.coeffs[0]+=c;
return C;
}
Polynomial Polynomial::operator +(double c)
{
Polynomial C=*this;
C.coeffs[0]+=c;
return C;
}
void Polynomial::Randomize(int max)
{
for (int i=degree; i>=0; i--)
{
coeffs[i]=rand()%(max+1) + 1;
if ((rand()%(101) + 1)%2 == 0)
coeffs[i]*=-1;
}
}
void Polynomial::operator =(Polynomial& A)
{
if (degree==A.degree)
{
for (int i=degree; i>=0; i--)
{
coeffs[i]=A.coeffs[i];
}
}
}
Polynomial Polynomial::operator+(const Polynomial& B)
{
if (degree>=B.degree)
{
Polynomial C(degree);
C=*this;
for (int i=B.degree; i>=0; i--)
{
C.coeffs[i]=coeffs[i]+B.coeffs[i];
}
return C;
}
else
{
Polynomial C=B;
for (int i=degree; i>=0; i--)
{
C.coeffs[i]=coeffs[i]+B.coeffs[i];
}
return C;
}
}
void Polynomial::operator+=(const Polynomial& B)
{
*this = (*this + B);
}
int Polynomial::Coeff(int deg)
{
return coeffs[deg];
}
void line(int lines)
{
for (int i=0; i<lines; i++)
cout << endl;
}
void Polynomial::GetCoeffs(istream& in)
{
for (int i=degree; i>=0; i--)
{
in >> coeffs[i];
}
in.ignore();
}
void Polynomial::Show(ostream& out)
{
if (coeffs[degree]>0)
cout << " ";
for (int i=degree; i>=0; i--)
{
if (coeffs[i]>=0)
{
if (i!=degree)
out << " + ";
out << coeffs[i];
}
else
{
if (coeffs[i]<0)
out << " - ";
out << 0-coeffs[i];
}
if (i>1)
out << "x^" << i;
else if (i==1)
out << "x";
}
}
Polynomial::Polynomial(const Polynomial& A)
{
coeffs=new double[A.degree+1];
degree=A.degree;
for (int i=A.degree; i>=0; i--)
{
coeffs[i]=A.coeffs[i];
}
}
Polynomial Polynomial::operator*(Polynomial& A)
{
int deg=A.degree+degree;
Polynomial P(deg);
for (int i=deg; i>=0; i--)
P.coeffs[i]=0;
for (int i=deg; i>=0; i--)
{
for (int j=A.degree; j>=0; j--)
{
P.coeffs[i+j]+=coeffs[i]*A.coeffs[j];
}
}
return P;
}
您的问题是*this + B
是临时的,临时对象不能绑定到非const
引用。
当然,没有理由不能const
作业的 RHS。 尝试:
void operator=(/* HERE */ const Polynomial& A);
您的大多数其他操作员也没有在他们应该使用的地方使用const
。 例如:
Polynomial operator+(const Polynomial& B) /* HERE */ const; //Polynomial + Polynomial
friend Polynomial operator +(double c, /* HERE */ const Polynomial& A); //c + Polynomial
只有赋值运算符应该是非const
成员,并且他们应该接受const
正确的操作数。 创建新对象的普通二元运算符应同时const
左操作数和右操作数。
通常以另一种方式完成。人们制作二进制+运算符(通常是非成员),利用已经定义的+=运算符(成员)。
我哪里出错了?
- 应使用
std::vector
而不是原始指针。 - 你违反了三法则。
- 您没有遵循创建会员
operator+=
和免费operator+
的约定。
试试这个:
// UNTESTED
class Polynomial
{
private:
std::vector<double> coeffs;
public:
//constructors
Polynomial() : coeffs(1) {}
Polynomial(int deg) : coeffs(deg+1) {}
// Don't need copy constructor
// Don't need destructor
// Don't need assignment operator
...
int Degree() {return coeffs.size()-1;}
//operators
Polynomial& operator+=(const Polynomial& B) {
if(Degree() < B.Degree())
coeffs.resize(B.Degree()+1);
for(int i = 0; i <= B.Degree(); ++i)
coeffs[i] += B.coeffs[i];
return *this;
}
};
Polynomial operator+(Polynomial A, const Polynomial& B) {
return A += B;
}
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 在noexcept 规范中是否允许使用"this"?
- 整体模板参数。错误:在常量表达式中使用'this'
- 在类方法中使用 "this" 指针是否是一种好的做法?
- 删除指针后阻止对象使用 "this"
- 我遇到了一些C++代码.为什么我们必须在块中使用 *this 而不是这个
- 何时使用'this'访问自己的成员
- 有没有办法强制对 clang-format/clang-tidy 中的类成员/方法使用 "this->"?
- 在模板类中使用"this"会导致参数初始化错误
- 使用 'this' 作为指向 CRTP 基类中派生类的指针
- 在普通 C 中使用 'this' 关键字
- 使用'this->'成员变量访问的性能
- GCC:当层次结构中存在虚拟继承时,C++11 内联对象初始化(使用 "this")不起作用
- 'this'问题不大(在非成员函数中无效使用'this')
- 在类定义中使用'this'
- Qt对象如果使用'this'创建(更新)需要删除或自动删除?
- 使用"this"指针初始化 std::array
- C++使用*this从静态方法调用一个抽象方法
- 我应该使用 "this" 关键字从成员函数内部访问类成员吗?
- 使用 "this" 关键字时的"Error: expression must have a pointer type"