重载运算符 [] 更改值

Overloading operator[] changing value

本文关键字:运算符 重载      更新时间:2023-10-16

我正在尝试重载一个 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)`

使用相同的循环我得到 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 函数。

这可能不是你唯一的问题,但看起来你想允许你的类的用户使用旧的 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];
}

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

return arrPtr[i];

你必须写

return arrPtr[i - first];

此外,如果构造函数会更好

IntArray(int num);

将被声明为类似

IntArray( size_t num);

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