+ 运算符重载中的错误

Error in + operator overloading

本文关键字:错误 重载 运算符      更新时间:2023-10-16
class Array
{
private:
int siz;
int *ptr;
public:
// constructos, setters, getters, and other functions.

void operator+(int x)                           // Addition operator
{
Array temp(siz+1);
for(int i = 0; i<temp.size; i++)
{
    temp.ptr[i] = ptr[i];
    if(i == temp.siz -1)
        temp.ptr[i] = x;
}
deallocate();
siz = temp.siz;
ptr = new int[siz];
for(int i= 0; i<siz;i++)
{
    ptr[i] = temp.ptr[i];
}
delete [] temp.ptr;
temp.ptr = NULL;
};
//GLOBAL FUNCTUONS
ostream &operator<< (ostream &o,Array A)
 {
for(int i = 0; i < A.siz; i++)
{
    out << A.ptr[i] << " ";
}
o << endl;
return out;
}
istream &operator>> (istream &in, Array &A)
{
int val;
for(int i=0; i<S.siz; i++)
{
    cout << "Enter value at S["<<i<<"]: ";
    cin >> value;
    A.setter(i,val);
}
return in;
}

int main()
{
 Array A1(2);
cin >> A1;
cout << A1 + 4;
}

编译器给出以下错误:

/usr/include/c++/4.8/ostream:476:5: note: template<class _CharT, class _Traits> std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&, char)
 operator<<(basic_ostream<_CharT, _Traits>& __out, char __c)
note:   cannot convert ‘S2.Set::operator+(4)’ (type ‘void’) to type ‘char’
  **cout << S2 + 4;**

我在类中为 ostream/istream 提供了好友函数。 ^

您尝试打印operator+的返回值,但没有。它的返回类型是void,如何打印void

使operator+返回对对象的引用:

Array& operator+(int x) {
    // ...
    return *this; // reference to self
}

但请注意,使用 + 来指示追加到现有数组似乎有点奇怪。 +通常意味着"将这两件事结合起来,把结果还给我"。例如,2+35,但它不会尝试将2的值更改为5。这根本说不通。

你可以像你一样使用operator+,但这对我来说没有多大意义。也许你可以称它为append(),或者insert()


另外,您有一个错误:

Array temp(siz+1);
for(int i = 0; i<temp.size; i++)
{
    temp.ptr[i] = ptr[i]; // <------- HERE
    if(i == temp.siz -1)
        temp.ptr[i] = x;
}

在标记的行中,您可以访问原始数组的末尾。相反,向上迭代到 this->siz ,然后单独分配新数组中的最后一个元素:

Array temp(this->siz+1);
for(std::size_t i = 0; i < this->siz; +i)
{
    temp.ptr[i] = this->ptr[i];
}
temp.ptr[this->siz] = x;

(叫它siz是怎么回事?这很令人困惑,看起来像一个错字。

您的operator+返回void 。 当您使用

cout << A1 + 4;

你实际上可以这样写

cout << A1.operator+(4);

现在您可以看到,我们尝试输出的是 返回对operator+(4)的调用 . 因为它是void它将失败,因为我们无法输出空白。 你需要operator+返回对对象的引用或返回临时 by 值。