重载operator + = with array c ++

时间:2018-06-18 10:40:41

标签: c++ arrays class c++11 operator-overloading

我正在做一个c ++程序。这就是我要做的事情:我创建一个我想要的大小的数组。该数组自动填充0

operator += i必须在1选择的位置插入i。 示例:

array += 2; 
will insert 1 at the index 2 of my array.

但是我该怎么办呢?

我的.h文件

#ifndef BITARRAY_H
#define BITARRAY_H
#include <ostream>

class bitArray
{
public:
    bitArray(int n);
    virtual ~bitArray();

    bitArray& operator+=(const bitArray&); //this operator
    bitArray& operator-=(const bitArray&);
    int& operator[] (int x) {
      return sortie[x];
  }
protected:
private:
    int sortie[];
    int n;
};

//ostream& operator<<(ostream&, const bitArray&);
#endif // BITARRAY_H

我在 cpp文件中的方法

bitArray& bitArray::operator+=(const bitArray& i)
{
    this ->sortie[i] = 1;
    return *this;
}

但它不起作用。我做得对吗?

我的错误是:

no match for 'operator[]' (operand types are 'int [0]' and 'const bitArray')|

提前谢谢!

2 个答案:

答案 0 :(得分:2)

  

MouseArea { // ... onPressed: { mouse.accepted = false } } 不匹配(操作数类型为&#39; int [0]&#39;和&#39; const   bitArray&#39;)|

错误很明显,operator[]期望一个整数类型和你传递operator[]类类型的错误。简单的解决方法是将其更改为整数。

但是,这里:

bitArray

强烈建议使用private: int sortie[]; int n; ,它提供连续的动态数组,而std::vector是静态分配。像这样:

See live here

sortie[]

更新:使用C ++ 17功能std::optional,使用可选的返回类型修改了上述解决方案,该类型应该更具可读性。

See output in wandbox

#include <iostream>
#include <vector>
#include <cstddef>

class bitArray
{
private:
   std::vector<int> sortie;
public:
   explicit bitArray(int size): sortie(size) {}
   bitArray& operator+=(const std::size_t i)
   {
      if (0 <= i && i < sortie.size()) // check for (0 <= index < size) of the array
      {
            this ->sortie[i] = 1;
            return *this;
      }
      else
      {
         // do your logic! for instance, I have done something like follows:
         std::cout << "out of bound" << std::endl;
         if(sortie.size() == 0) sortie.resize(1,0); // if the size of array == 0            
      }
      return *this;
   }
   int operator[] (const std::size_t index)
   {
      return (0 <= index && index < sortie.size()) ? sortie[index] : -1;
   }
};
int main ()
{
   bitArray obj(3);
   obj += 0;  std::cout << obj[0] << std::endl;
   obj += -2; std::cout << obj[-2] << std::endl;
   obj += 22; std::cout << obj[22] << std::endl; 
   return 0;
}

答案 1 :(得分:1)

您的operator+=需要bitArray作为参数,但它应该将索引设置为1,这基本上是错误消息试图告诉您的内容:没有您尝试使用它的参数的重载。

请注意,要获得这样的运算符,您不需要编写自己的数组类,但可以为std::vector提供重载:

#include <iostream>
#include <vector>

template <typename T> 
std::vector<T>& operator+=(std::vector<T>& v,size_t index) {
    v[index] = 1;
    return v;
}     

int main() {
    auto vec = std::vector<int>(10,0);
    vec += 5;
    std::cout << vec[5];
    return 0;
}

请注意,这是实现+=的一种相当罕见的方式(它实际上并没有添加任何内容)。我认为这是滥用运算符重载,它会导致代码混淆。考虑一下:

vec[5] = 1;

vs

vec += 5;

在第一行中,每个熟悉std::vector的人都会知道它的作用,而对于第二行,90%的期望将会消失。我猜你做这个作为作业或作业的一部分,但是对于其他任何我建议你远离使用操作符重载,除了明显的事情之外做任何事情。