我正在尝试重载一个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函数。
答案 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];
}