C++ 重载运算符[]更改值
我试图重载一个int数组,所以基本上如果我的主函数中有这个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
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]
wherex>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];
}