类的C++属性似乎已重新初始化

C++ property on class seems to be reinitialized

本文关键字:初始化 C++ 属性 类的      更新时间:2023-10-16

在类Element中,我有一个名为size的属性,默认值为0

当我在main()上调用insertElement时,调用size++的行工作正常,但在调用函数shiftElementsToRight(i);的下一行中,size元素被重新启动为0

为什么会发生这种情况?我用错误的方式声明了我的Element类?

在Ubuntu Linux 上使用g++9.2.1

#include<iostream>
using namespace std;
int const ARRAY_MAX = 100;
class Element {
public:
int elements[ARRAY_MAX] = {};
int size = 0;
void shiftElementsToRight(int pos) {
int temp = elements[pos+1];
for (int i=ARRAY_MAX-1; i>=pos; i--) {
elements[i+1] = elements[i];
}
elements[pos] = NULL;
}
void shiftElementsToLeft(int pos) {
int temp = elements[pos];
int i = ARRAY_MAX;
for (int i=pos; i<ARRAY_MAX-1; i++) {
elements[i-1] = elements[i];
}
}
void insertElement(int value) {
int i = 0;
size++;
while ((i<ARRAY_MAX) && (elements[i] != NULL)) {
if (elements[i]>value) {
break;
}
i++;
}
shiftElementsToRight(i);
elements[i] = value;
}
int deleteElement(int value) {
int pos = binarySearch(value);
if (pos!=-1) {
shiftElementsToLeft(pos+1);
}
size--;
return pos;
}
int binarySearch(int value) {
int left = 0;
int right = size;
cout << "Begin" << endl;
while (left<right) {
int middle = left + (right -left) / 2;
cout << "L: " << left << " R: " << right << endl;
if (elements[middle] == value) {
return middle;
}
if (elements[middle]>value) {
right = middle-1;
}
if (elements[middle]<value) {
left = middle+1;
}
}
return -1;
}
};
int main() {
Element *element = new Element();
element->insertElement(3);
element->insertElement(2);
element->insertElement(5);
element->insertElement(6);
element->insertElement(4);
element->deleteElement(3);
return 0;
}

在中

for (int i=ARRAY_MAX-1; i>=pos; i--) {
elements[i+1] = elements[i];
}

您第一次访问elements是在ARRAY_MAX - 1 + 1位置。您正在访问elements[ARRAY_MAX],它在该数组的边界之外,(可能(指向size