重载括号运算符赋值
Overload bracket operator assign
我在使用 [] 运算符赋值时遇到问题,我有 2 个不同的错误,
"binary '=': no operator found which takes a right-hand operand of type 'double' (or there is no acceptable conversion)"
没有运算符“=”匹配这些操作数。
我是不是漏掉了什么?
页眉
Class CMyVector{
public:
double operator[](const int index) const;
double & operator[](const int index);
CMyVector operator+(const CMyVector mv1);
}
cpp
double CMyVector::operator[](const int index) const
{
return arr[index];
}
double & CMyVector::operator[](const int index)
{
return arr[index];
}
CMyVector CMyVector::operator+(const CMyVector mv1)
{
CMyVector *retval = new CMyVector();
retval[0] = arr[i] + mv1[i];
return *this;
}
在加法运算符函数中,retval
是一个指针,这意味着您必须取消引用它才能使用运算符"inline":
(*retval)[i] = ...
或者您可以使用 "arrow" 运算符显式调用运算符函数(它会为您取消引用):
retval->operator[](i) = ...
但是变量应该不是一个指针,因为它是值你应该return,这意味着您的运算符函数存在缺陷,因为它会给您带来内存泄漏 和 而不是 return 正确的值。
参见例如this operator overloading reference 有关如何实施它的示例。
CMyVector CMyVector::operator+(const CMyVector mv1)
{
CMyVector *retval = new CMyVector();
for (int i = 0;i < dim;i++)
{
retval[i] = arr[i] + mv1[i];
}
return *this;
}
这个函数有一些问题:
您不应该动态分配 CMyVector
以便按值 return;那只会泄漏内存并产生不必要的成本。它应该只是 CMyVector retval;
.
由于retval
是一个指针,retval[i]
试图像数组一样对其下标。你会想要 (*retval)[i]
,但由于我们摆脱了上面的动态分配,你可以只做 retval[i]
.
你 return *this
而不是 *retval
。现在应该是 return retval;
.
你应该引用你的论点以避免复制。
operator+
通常最好作为非成员函数实现,以便对称地处理参数。
固定码:
CMyVector operator+(const CMyVector& lhs, const CMyVector& rhs)
{
CMyVector retval;
for (int i = 0; i < dim; i++)
{
retval[i] = lhs[i] + rhs[i];
}
return retval;
}
CMyVector::operator+
看起来很奇怪。
1.retval
是指针,(即CMyVector *
),那么retval[i]
就是CMyVector
,对[=16=没有意义].你的意思可能是 (*retval)[i] = arr[i] + mv1[i];
。顺便说一句:这是内存泄漏,因为您没有 delete
指针。
2.Younew
一个指针retval
,然后给它赋值,最后return*this
?这没有意义。您可能是指:
CMyVector CMyVector::operator+(const CMyVector& mv1)
{
CMyVector retval;
for (int i = 0;i < dim;i++)
{
retval[i] = arr[i] + mv1[i];
}
return retval;
}
我在使用 [] 运算符赋值时遇到问题,我有 2 个不同的错误,
"binary '=': no operator found which takes a right-hand operand of type 'double' (or there is no acceptable conversion)"
没有运算符“=”匹配这些操作数。
我是不是漏掉了什么?
页眉
Class CMyVector{
public:
double operator[](const int index) const;
double & operator[](const int index);
CMyVector operator+(const CMyVector mv1);
}
cpp
double CMyVector::operator[](const int index) const
{
return arr[index];
}
double & CMyVector::operator[](const int index)
{
return arr[index];
}
CMyVector CMyVector::operator+(const CMyVector mv1)
{
CMyVector *retval = new CMyVector();
retval[0] = arr[i] + mv1[i];
return *this;
}
在加法运算符函数中,retval
是一个指针,这意味着您必须取消引用它才能使用运算符"inline":
(*retval)[i] = ...
或者您可以使用 "arrow" 运算符显式调用运算符函数(它会为您取消引用):
retval->operator[](i) = ...
但是变量应该不是一个指针,因为它是值你应该return,这意味着您的运算符函数存在缺陷,因为它会给您带来内存泄漏 和 而不是 return 正确的值。
参见例如this operator overloading reference 有关如何实施它的示例。
CMyVector CMyVector::operator+(const CMyVector mv1)
{
CMyVector *retval = new CMyVector();
for (int i = 0;i < dim;i++)
{
retval[i] = arr[i] + mv1[i];
}
return *this;
}
这个函数有一些问题:
您不应该动态分配
CMyVector
以便按值 return;那只会泄漏内存并产生不必要的成本。它应该只是CMyVector retval;
.由于
retval
是一个指针,retval[i]
试图像数组一样对其下标。你会想要(*retval)[i]
,但由于我们摆脱了上面的动态分配,你可以只做retval[i]
.你 return
*this
而不是*retval
。现在应该是return retval;
.你应该引用你的论点以避免复制。
operator+
通常最好作为非成员函数实现,以便对称地处理参数。
固定码:
CMyVector operator+(const CMyVector& lhs, const CMyVector& rhs)
{
CMyVector retval;
for (int i = 0; i < dim; i++)
{
retval[i] = lhs[i] + rhs[i];
}
return retval;
}
CMyVector::operator+
看起来很奇怪。
1.retval
是指针,(即CMyVector *
),那么retval[i]
就是CMyVector
,对[=16=没有意义].你的意思可能是 (*retval)[i] = arr[i] + mv1[i];
。顺便说一句:这是内存泄漏,因为您没有 delete
指针。
2.Younew
一个指针retval
,然后给它赋值,最后return*this
?这没有意义。您可能是指:
CMyVector CMyVector::operator+(const CMyVector& mv1)
{
CMyVector retval;
for (int i = 0;i < dim;i++)
{
retval[i] = arr[i] + mv1[i];
}
return retval;
}