以下是我的代码在第74行出现错误:需要左值作为分配的左操作数。我相信这是由于我的运营商[]的声明,但我无法解决它。有什么建议?提前谢谢。
#include<iostream>
using namespace std;
void constructArr(int *arr, int n){
for (int i=0; i<n; i++){
arr = '\0';
}
}
class vector_int{
public:
int *arr;
int size;
vector_int(int n){
size = n-1;
arr = new int [n];
constructArr(arr, size);
}
vector_int(){
arr = new int[1];
size = 0;
}
~vector_int(){
delete [] arr;
}
void push_back(int n){
int *temp;
temp = new int [size+1];
constructArr(temp, size);
temp = arr;
temp[size] = n;
arr = temp;
size++;
}
void pop_back(){
int *temp;
temp = new int[size-1];
constructArr(temp, size-1);
for (int i=0; i<size-1; i++){
temp[i] = arr[i];
}
arr = new int [size-1];
arr = temp;
size--;
}
int length(){
return size;
}
int top(){
return arr[size-1];
}
int operator [](int index){
if (index<=size){
return arr[index];
}
else if (index<0 || index>size-1){
return arr[size-1];
}
}
int& operator[](int index)const{ //how to correct this?
if (index>size-1 || index<0){
return arr[size-1];
}
else{
return arr[index];
}
}
};
int main(){
vector_int test(10);
for (int i=0; i<10; i++){
test[i] = i; //compiler returns error here
}
for (int i=0; i<10; i++){
cout<<test[i];
}
}
答案 0 :(得分:0)
vector_int test(10);
这是该类的非const实例。
test[i] = i;
这是调用返回operator[]
的非const int
重载。 注意,这不是int&
,因此您尝试将值分配给导致问题的临时值(即临时值是右值而不是左值)。
另一个奇怪的是,operator[]
的const重载返回int&
,这意味着允许修改内部状态,这与声明成员函数const相矛盾。
您应该使用:
int& operator[](int) { ... }
const int& operator[](int) const { ... }
或者可能:
int& operator[](int) { ... }
int operator[](int) const { ... }
答案 1 :(得分:0)
您的错误不在第61行,它在第53行,应该是:
int &operator [](int index){
您收到错误,因为您必须通过引用传递该值。这是有道理的,因为当您重载运算符时,您将始终以某种方式修改该对象。
答案 2 :(得分:0)
int& operator[](int index) const
毫无意义。关键字const
表示操作员不会修改对象。但是,通过返回非const引用,它间接允许调用者修改对象....
如果您要声明运算符以只读方式访问向量元素,则需要返回const引用:const int& operator[](int index) const
或副本int operator[](int index) const
。然后,您保证在operator[]
对象上使用const
不会修改它。
如果您打算声明运算符以读取和写入方式访问向量元素,则需要删除const
关键字:int& operator[](int index) const
。
通常,您的类应声明只读(const
方法,返回复制或const引用)和读/写(非const
方法,返回非const引用){{1} }。