我正在做一个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')|
提前谢谢!
答案 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
是静态分配。像这样:
sortie[]
更新:使用C ++ 17功能std::optional
,使用可选的返回类型修改了上述解决方案,该类型应该更具可读性。
#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%的期望将会消失。我猜你做这个作为作业或作业的一部分,但是对于其他任何我建议你远离使用操作符重载,除了明显的事情之外做任何事情。