重载运算符 [] 更改值
Overloading operator[] changing value
我正在尝试重载一个 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
相关文章:
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- <T> 通过模板化运算符重载将 std::complex 乘以双倍
- C++20概念:需要运算符重载
- 使用赋值运算符重载从类中返回jobject
- 在运算符重载定义中使用成员函数(const错误)
- 字节到位运算符重载C++
- 为什么在运算符重载时需要参考?
- 类中 c++ 的运算符 + 重载
- 算术复合运算符重载为非成员
- 运算符重载 (+),用于添加两个具有 C++ 的数组
- 交换运算符 + 重载会导致无限递归
- 如何理解新的运算符重载?
- 向量保持复数的运算符重载
- 如何创建运算符重载?
- 链接列表运算符重载没有打印出我想要的内容
- C++:需要帮助了解运算符重载错误
- 使用模板化运算符重载 XOR 运算符失败
- 如何确保接受的C++模板类型使运算符重载?
- 运算符重载使用运算符+添加类模板