C++ 重载运算符[]更改值

C++ 重载运算符[]更改值,c++,overloading,C++,Overloading,我试图重载一个int数组,所以基本上如果我的主函数中有这个 IntArray arr(10); for(int i = 0; 0 < 10; i++) a[i] = i * 10; 我能让这个工作 如果我这样做 IntArray arr(-3, 10) 使用相同的for循环,我也能够得到适当的答案。 但是 如果我这样做 使用相同的循环,我得到c[6]=1,c[7]=1,c[8]=0 从昨天开始我就一直在想这个问题,下面是我的代码: //---------------------H

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

IntArray arr(10); 
for(int i = 0; 0 < 10; i++)
  a[i] = i * 10;
我能让这个工作

如果我这样做

IntArray arr(-3, 10)
使用相同的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_ */
//---------------------

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

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

return arrPtr[i];
你必须写作

return arrPtr[i - first];
另外,如果

IntArray(int num);
将被宣布为

IntArray( size_t num);

相应地,数据成员
size
将具有类型
size\t

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

要支持此功能,您需要在
操作符[]
中对其进行修改:

int& IntArray::operator[](int i) {
    if (i > last || i < first ){
        cout<<"Error: Index out of range"<<endl;
        exit(1);
    } 
    return arrPtr[i - first];
}
int&IntArray::运算符[](int i){
如果(我>最后一个| |我<第一个){

我们不会为您调试代码。您应该先进行一些基本调试,以缩小问题范围。您的
运算符[]
是错误的。请记住,内部索引0不一定是外部索引0。数组的大小是
8-6+1=3
。因此
arrPtr[x]
where
x>2
没有定义。改变你的想法。有一件事,这对你现在的IntArray不起作用:
void foo(const IntArray&a){int x=a[0];}
你的
操作符[]
需要两个重载,而不是一个。另一方面注意:你的单参数和无参数的构造函数应该是内联的,只需委托给双参数版本。单参数的构造函数必须是显式的。你违反了3(5)的规则,结果很糟糕:注意复制构造函数/op=(移动时也是如此)。您的
op=
可能不应该进行有效性测试,但如果它进行了
中止则更合适。我想知道您将如何实现
op>
。。。
return arrPtr[i];
return arrPtr[i - first];
IntArray(int num);
IntArray( size_t num);
int& IntArray::operator[](int i) {
    if (i > last || i < first ){
        cout<<"Error: Index out of range"<<endl;
        exit(1);
    } 
    return arrPtr[i - first];
}