重载+运算符以添加数组

Overloading the + operator to add arrays

本文关键字:添加 数组 运算符 重载      更新时间:2023-10-16

我试图通过重载加法运算符将两个排序的列表合并在一起。我只需要遍历第一个和第二个列表一次,然后将每个元素添加到新列表中,然后返回。我收到一个错误,说运算符必须接受零个或一个参数,但当我尝试一个参数时,也不起作用。这是我的代码:

  template<class mytype>
OrderedList<mytype> operator+ (const OrderedList<mytype>& a,const OrderedList<mytype>& b)
{
int size = a.size() + b.size();
int i=0, j=0, k=0;
OrderedList<mytype> newList(size);
   while (i < a.size() && j < b.size()) 
   {
        if (a.get(i) <= b.get(j)) 
        {
             newList.list[k] = a.list[i];
              i++;
        } else 
        {
              newList.list[k] = list[j];
              j++;
        }
        k++;
  if (i < a.size())
  {
        for (int p = i; p < a.size(); p++) 
        {
              newList.list[k] = a.list[p];
              k++;
        }
  } else 
  {
        for (int p = j; p < count; p++) 
        {
              newList.list[k] = list[p];
              k++;
        }
  }
}
return newList;

}

如果二进制运算符是非成员函数,则只能用两个参数声明它们。在OrderedList<mytype>::operator+中使用作用域解析运算符::表示operator+OrderedList<mytype>的成员函数,但如果是这样,则不能使用两个参数。第一个参数是指向当前对象的指针,第二个参数是右手参数。

如果函数在OrderedList<type>中被声明为friend,那么它是一个非成员函数,您可以将其定义为:

OrderedList<mytype> operator+(const OrderedList<mytype>& a, const OrderedList<mytype>& b);

也就是说,没有范围解析操作符。

如果它被声明为成员函数(仅取右侧),那么您将其定义为:

OrderedList<mytype> OrderedList<mytype>::operator+(const OrderedList<mytype>& b);

其中左手边的自变量隐含地为this

您当前的operator+正在接受3参数。两个显式和一个隐式(this)。所以这不是一个有效的operator+。编译器告诉您的01自变量是您正在编写成员函数的事实,因此this中的一部分应该:

  • 采用0个附加参数(并具有一元operator+,如int x = +a中所示)
  • 取1个额外的参数(并具有二进制operator+,如int x = a + b

你想要的可能是第二个。因此,您可以执行以下任一操作:

  • 将正文中出现的所有a替换为(*this)
  • 将该运算符移出类,并有效地声明一个自由函数(推荐)