我一直在尝试创建一个矢量类。关于运营商

时间:2016-05-03 18:18:02

标签: c++ class

以下是我的代码在第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];
}
}

3 个答案:

答案 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} }。