gpt4 book ai didi

循环中指向int的C++指针?

转载 作者:太空宇宙 更新时间:2023-11-04 15:03:56 28 4
gpt4 key购买 nike

好吧,我对 C++ 很陌生,我确定这个问题已经在某个地方得到了回答,而且也很简单,但我似乎找不到答案....

我有一个自定义数组类,我将其用作练习来尝试了解其工作原理,其定义如下:

标题:

class Array {
private:
// Private variables
unsigned int mCapacity;
unsigned int mLength;
void **mData;

public:
// Public constructor/destructor
Array(unsigned int initialCapacity = 10);

// Public methods
void addObject(void *obj);
void removeObject(void *obj);
void *objectAtIndex(unsigned int index);
void *operator[](unsigned int index);
int indexOfObject(void *obj);
unsigned int getSize();
};
}

实现:

GG::Array::Array(unsigned int initialCapacity) : mCapacity(initialCapacity) {
// Allocate a buffer that is the required size
mData = new void*[initialCapacity];
// Set the length to 0
mLength = 0;
}

void GG::Array::addObject(void *obj) {
// Check if there is space for the new object on the end of the array
if (mLength == mCapacity) {
// There is not enough space so create a large array
unsigned int newCapacity = mCapacity + 10;
void **newArray = new void*[newCapacity];
mCapacity = newCapacity;
// Copy over the data from the old array
for (unsigned int i = 0; i < mLength; i++) {
newArray[i] = mData[i];
}
// Delete the old array
delete[] mData;
// Set the new array as mData
mData = newArray;
}
// Now insert the object at the end of the array
mData[mLength] = obj;
mLength++;
}

void GG::Array::removeObject(void *obj) {
// Attempt to find the object in the array
int index = this->indexOfObject(obj);
if (index >= 0) {
// Remove the object
mData[index] = nullptr;
// Move any object after it down in the array
for (unsigned int i = index + 1; i < mLength; i++) {
mData[i - 1] = mData[i];
}
// Decrement the length of the array
mLength--;
}
}

void *GG::Array::objectAtIndex(unsigned int index) {
if (index < mLength) return mData[index];
return nullptr;
}

void *GG::Array::operator[](unsigned int index) {
return this->objectAtIndex(index);
}

int GG::Array::indexOfObject(void *obj) {
// Iterate through the array and try to find the object
for (int i = 0; i < mLength; i++) {
if (mData[i] == obj) return i;
}
return -1;
}

unsigned int GG::Array::getSize() {
return mLength;
}

我正在尝试创建一个指向整数的指针数组,其简化版本如下:

Array array = Array();
for (int i = 0; i < 2; i++) {
int j = i + 1;
array.addObject(&j);
}

现在的问题是在每次迭代中对 j 使用相同的指针。所以在循环之后:

array[0] == array[1] == array[2];

我确信这是预期的行为,但这并不是我想要发生的,我想要一个指向不同整数的不同指针的数组。如果有人能在这里指出我正确的方向,将不胜感激! :)(我显然误解了如何使用指针!)

附言感谢大家的回应。我接受了解决我遇到的问题的那个!

最佳答案

我猜你的意思是:

array[i] = &j;

在这种情况下,您将存储一个指向临时对象的指针。在每个循环中,j 都分配在堆栈的堆栈地址中,因此 &j 产生相同的值。即使您返回不同的地址,您的代码也会在您存储指向临时对象的指针时导致问题。

此外,为什么要使用 void* 数组。如果您实际上只想要 3 个唯一的整数,那么只需执行以下操作:

std::vector<int> array(3);

它更像 C++,并且消除了各种错误。

关于循环中指向int的C++指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21906640/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com