重载operator []更改值

时间:2014-11-24 20:15:32

标签: c++ overloading

我正在尝试重载一个int数组,所以基本上如果我在我的主函数中有这个

IntArray arr(10); 
for(int i = 0; 0 < 10; i++)
  a[i] = i * 10;

我能够得到

a[0] = 0, a[1] =10, a[2]=20.... so on

我能够使这个工作。

如果我那么做

IntArray arr(-3, 10)

使用相同的for循环,我也能得到合适的答案。 但... 如果我做

IntArray arr(6, 8)`

使用相同的for循环我得到c [6] = 1,c [7] = 1,c [8] = 0 我从昨天起就试图解决这个问题,这是我的代码:

//---------------------Header file

#ifndef INTARRAY_H_
#define INTARRAY_H_

#include <iostream>


using namespace std;

class IntArray
{

private:
    int first;
    int last;
    int size;

    string arrName;
    int* arrPtr;


public:
    IntArray();
    int& operator[](int i);

    IntArray(int num);
    IntArray(int num1, int num2);

    int low();
    int high();
    void setName(string str);
    //streams
    friend istream& operator>>(istream& is, IntArray& d);
    friend ostream& operator<<(ostream& os, IntArray& d);

};

#endif /* INTARRAY_H_ */
//---------------------

我的int数组类:

#include "IntArray.h"



IntArray::IntArray(){
    size = 10;
    first = 0; last = 9;
    arrPtr = new int[size];
}

IntArray::IntArray(int num){
    size = num;
    first = 0; last = size-1;
    arrPtr = new int[size];
    //cout<<"\n the size "<<size<<endl;
    //arrPtr[3] = 123;

    //ex = 3;
}

IntArray::IntArray(int num1, int num2){
    first = num1; last = num2;
    size = last - first + 1;
    //cout<<"\n the size "<<size<<endl;
    arrPtr = new int[size];
}

int& IntArray::operator[](int i) {
    if (i >= (last+1)){
        cout<<"Error: Index out of range"<<endl;
        exit(1);
    }
    return arrPtr[i];
}

int IntArray::getInt(int i){
    return arrPtr[i];
}

//======================
int IntArray::low(){
    return first;
}
int IntArray::high(){
    return last;
}
//======================
//==========OUT stream==========

// for cout << justName<< endl;
ostream& operator<<(ostream& os, IntArray& aPtr) {
    for(int i = aPtr.low(); i <= aPtr.high(); i++){
        os << aPtr.arrName <<"[" << i << "] = " << aPtr[i] << " ";
    }

    return os;
}

void IntArray::setName(string str){
    arrName = str;
}

由于某些明显的原因,在此测试函数上使用我的setName函数后,它将值更改为c [6] = 1,c [7] = 1,c [8] = 0.

 void test3() {
    IntArray c(6, 8);
    for(int i = c.low(); i <= c.high(); i++)
        c[i] = i * 10;
    c.setName("c");
    cout << c << endl;

}

让我明白这一点。就像我说的那样,我确实缩小了我的问题。

IntArray a(10)  //THIS ONE WORKS!
IntArray a(-3, 6) //THIS ONE WORKS!
IntArray a(6,8) //NOT working.

对于最后一个,数组输出正确的值,直到我使用setName函数。

2 个答案:

答案 0 :(得分:0)

在下标运算符中,您还应检查i是否不小于first。 故事考虑到相对于指针你必须使用从零开始的索引。而不是

return arrPtr[i];

你必须写

return arrPtr[i - first];

如果构造函数

也会更好
IntArray(int num);

将被声明为

IntArray( size_t num);

并且相应的数据成员size将具有类型size_t

答案 1 :(得分:0)

这可能不是您唯一的问题,但看起来您希望允许您的班级用户使用旧的Perl $[

为了支持这一点,您需要在operator[]

中对其进行修改
int& IntArray::operator[](int i) {
    if (i > last || i < first ){
        cout<<"Error: Index out of range"<<endl;
        exit(1);
    } 
    return arrPtr[i - first];
}