访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组
Posted
技术标签:
【中文标题】访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组【英文标题】:Access pointer array / through another pointer and delete single element in array without deleting first pointer or whole array 【发布时间】:2012-08-18 21:15:13 【问题描述】:在我的主窗口中,我创建了一个 PointerClass 的实例,它包含一个指向 PointerObject 的指针数组(我希望能够访问 用 PointerObject[X][Y] 和 以同样的方式删除它,并检查是否 PointerObject[X][Y] == NULL(这就是为什么我使用指针))并且我不想要带有向量的解决方案。
#define X 10
#define Y 10
class PointerObject
public:
int X;
int Y;
class PointerClass
public:
PointerObject *ArrayOfPointerObjects[X][Y];
PointerMethod(&PointerClass);
然后,在我的 PointerMethod 中创建指向数组的指针:
PointerMethod(PointerClass *pointerClass)
// don't know the right way to do this
pointerClass->ArrayOfPointerObjects= new PointerObject[X][Y];
// set all pointers in the array to NULL - is this needed?
for (int x=0; x < X; x++)
for (int y=0; y < Y; y++)
pointerClass->ArrayOfPointerObjects[x][y] = NULL;
// trying to store some data here
pointerClass->ArrayOfPointerObjects[0][0] = new PointerObject;
// trying to delete it
delete pointerClass->ArrayOfPointerObjects[0][0];
// or trying this:
delete[] pointerClass->ArrayOfPointerObjects[0][0];
// causes access violation or doesn't work
我之前问过这个没有成功或关于错误类型的问题。
Delete pointer to multidimensional array in class through another pointer - how?
我可以访问数组,检查它是否为 NULL。但是当我调用 delete / delete[] pointerClass->ArrayOfPointerObjects[x][y] 时,它似乎删除了指向指针类的指针而不是 [X][Y] 处的元素,我想删除位置 [X] 处的指针[Y] 而不是指针类,我不想删除整个数组。
我怎样才能做到这一点又不会太复杂?我猜我的数组并不是真正的指针数组,只是指向数组的指针。但我希望它是存储在指针或其他东西中的指针数组。仍然重要的是我如何访问它以及如何删除数组中的元素。我需要能够检查指针是否为 NULL,如果无法删除该单个 PointerObject。
重要的是我想:
-
使用 [X][Y] 访问 PointerObjects 数组
检查数组中的对象是否为 NULL(=需要指针)
删除指针数组中的单个项目,而不破坏指向 PointerClass 对象的指针或删除数组的其余部分。只需删除数组中某个 X、Y 位置的单个 PointerObject,使删除后的 [X][Y] = NULL。
如果与我的其他线程有太多的混淆或相似之处,那是因为人们告诉我我不希望的事情并且它导致了主题,这里更好地说明它是如何工作的以及我希望它如何工作。
【问题讨论】:
您的条件绝不需要“原始”指针。 请进一步解释。我不能只创建 PointerObjects 的多维数组并设置 PO[X][Y] = NULL,或删除 PO[X][Y] 或检查是否 (PO[X][Y] == NULL) 而不使用指针.unique_ptr
例如,完全满足您的要求;一般来说,我会把你指向他们和vectors
,出于某种原因,你似乎反对这样的解决方案。
如果有要求阻止使用向量的解决方案,您需要解释原因。人们如何知道他们提出的任何其他解决方案是否满足您未公开的要求?
因为你如何循环遍历它,因为如果我删除一个对象,我每次都必须重置循环并且我经常要删除对象,所以我首先检查应该删除哪些坐标然后我删除它们而不是循环和循环和循环。
【参考方案1】:
嗯,我想像this
#include <iostream>
class Foo
int i_;
int j_;
public:
Foo(int i, int j) : i_(i), j_(j)
void print_coords()
std::cout << this << " (" << i_ << ',' << j_ << ')' << std::endl;
;
class Bar
public:
Foo *arr[5][5];
;
class Que
public:
void init(Bar *b)
for(int i=0; i<5; i++)
for(int j=0; j<5; j++)
b->arr[i][j] = new Foo(i, j);
void print(Bar *b, int i, int j)
try
if(b->arr[i][j])
b->arr[i][j]->print_coords();
else
throw 0;
catch (int e)
std::cout << &b->arr[i][j] << " points to null" << std::endl;
void rem(Bar *b, int i, int j)
delete b->arr[i][j];
b->arr[i][j] = 0;
;
int main()
Bar *b = new Bar();
Que *q = new Que();
q->init(b);
q->print(b, 2, 2);
q->rem(b, 2, 2);
q->print(b, 2, 2);
return 0;
【讨论】:
以上是关于访问指针数组/通过另一个指针并删除数组中的单个元素而不删除第一个指针或整个数组的主要内容,如果未能解决你的问题,请参考以下文章