- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
所以我重载了 += 运算符,试图利用我已经定义的 + 运算符。即 Polynomial + Polynomial 返回一个新的 Polynomial。所以我的 += 函数基本上尝试调用 this + 函数,其中 LHS 为 *this,RHS 为 *this + B(其中 B 是通过 const 引用传递给函数的 Polynomial 对象)。我收到一个错误。我哪里错了?
#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
是一个临时对象,临时对象不能绑定(bind)到非 const
引用。
当然,赋值的 RHS 没有理由不能是 const
。尝试:
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
wrt 左右操作数。
关于c++ - 重载 = 运算符时如何使用 THIS 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12906695/
假设我有一个类,我在其中重载了运算符 == : Class A { ... public: bool operator== (const A &rhs) const; ... };
我知道你不应该使用 std::find(some_map.begin(), some_map.end()) 或 std::lower_bound,因为它会采用线性时间而不是 some_map.lowe
我正在尝试在 Haskell 中定义 Vector3 数据类型,并允许在其上使用 (+) 运算符。我尝试了以下方法: data Vector3 = Vector3 Double Double Doub
我已经为我的类图将运算符重载为“-”。它的用途并不完全直观(糟糕的编码 - 我知道)但是如果我做 graph3 = graph2-graph1 那么图 3 是应该只接收图 2 和图 1 中的那些顶点。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Operator overloading 我想重载 以按字母顺序排列字符串,但我不确定该怎么做。 如何再次
下面的代码给我一个编译错误。谁能告诉我为什么? class mytype { public: int value; mytype(int a) { value = a;
这有什么问题吗? class Vec2 attr_accessor :x, :y # ... def += (v) @x += v.x @y += v.y retu
是否可以重载 [] 运算符两次?允许这样的事情:function[3][3](就像在二维数组中一样)。 如果可能的话,我想看看一些示例代码。 最佳答案 您可以重载 operator[] 以返回一个对象
我的团队目前正在与 Lua 合作,创建一个 android 游戏。我们遇到的一件事是表面上无法创建重载构造函数。 我习惯于使用默认值设置一个对象,然后在需要时使其过载。 前任: apples() {
我有一个网页,在某个时候显示一个导航栏,它只不过是一个 a 元素的列表 (ul)。所述 a 元素的大多数样式规则都是通用的。唯一应该改变的部分是要显示的图像,可以从列表中每个 li 元素的 id 标签
我对使用/重载“范围步长”运算符(.. ..)很感兴趣,但我终其一生都无法了解如何使用它。 在文档中它说 // Usage: start .. step .. finish 但是在 F# shell
Java 11(可能无关紧要): public static String toString(Object obj) { return ReflectionToStringBuilder.to
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我无法理解以下代码(针对行号进行注释) class Base { void m1(Object o) { } void m2(String o) { } } publi
我有以下代码片段: #include using namespace std; struct Integer{ int x; Integer(const int val) : x(v
class myclass{ //definitions here }; myclass e; int myarray[10]; /* Do something... */ e = myarray;
为什么不能将下标运算符(operator [])作为 friend 函数重载? 最佳答案 正如Bjarne Stroustrup在D&E book中所说: However, even in the o
我有以下代码片段: #include using namespace std; struct Integer{ int x; Integer(const int val) : x(v
因此,我有一个问题是我最近尝试重载 namespace Eng { /** * A structure to represent pixels */ typedef
如何重载onResume()以正确的方式工作?我想从 activity 返回到 MainActivity ,我希望在其中具有与应用程序启动后相同的状态。我想使用 recreate() 但它循环了或者类
我是一名优秀的程序员,十分优秀!