无法分配给 C++ 中的指针数组
Posted
技术标签:
【中文标题】无法分配给 C++ 中的指针数组【英文标题】:cannot assign to array of pointers in c++ 【发布时间】:2021-07-26 03:23:56 【问题描述】:我需要在 c++ 中保留一个指针数组。我有一个集合来保存我班级的对象。然后我需要遍历集合并将每个项目的指针保留在数组中。顺便说一下,数组是二维的。所以我需要总结的是: 指针[1][4] = PinterToAnItem;原因是我需要稍后删除该项目,所以我想保留指针并直接转到该项目并删除它,而不是再次迭代并找到然后删除。但是我在分配数组时出错。我不知道这个想法将如何运作,但到目前为止它给了我错误。如果不清楚请告诉我
错误是:“CONST类型的值不能分配给电影类型”
struct Movie
int movieId;
int shopId;
int priceId;
;
Movie *pointers[100][100];
set<Movie> setMovie;
void main()
//reading and initialize the set with movies
// for example movie1 = 0,10,3 so I want to keep in my array a pointer to this object as:
// pointer [0][10] = ObjectPointer
// I have error in loop body. Also (*id), id and &id does not work.
for (auto id = setMovie.begin(); id != setMovie.end(); id++)
pointers[(*id).movieId][(*id).shopId] = &(*id);
2-顺便说一句,你们认为这是一个好主意吗?我可以删除指向集合中对象的指针[0][10] 吗?所以通过这种方式,我不需要再次遍历集合并删除(0,10)。我有一个指向 (0,10) 的指针,我将它从集合中删除。 谢谢
已编辑
@Jeffry 的答案是正确的,但它不适用于我删除指定项目的其余问题。我打算保留一个指向项目的指针,然后直接删除它。但我们知道 set.erase(ITERATOR) 或 (actual_value)。所以这里的指针对我不起作用。我必须更改迭代器数组,然后它才能工作。所以我在这里完成,也许以后可以工作。
set<Movie> ::iterator pointers[100][100];
for (auto id = setMovie.begin(); id != setMovie.end(); id++)
pointers[(*id).movieId][(*id).shopId] = id; // I changed here as well
setMovie[1].erase(pointers[1][0]); // works well
// pointers[1][0] is an iterator to an item in set with movieid=1,shopid=0
【问题讨论】:
为什么要手动删除pointers
的内容呢? set<Movie>
将在程序结束时调用所有 Movie
析构函数。
不管怎样,set
要求它的成员是不变的,以保证一旦插入它以后就不必更改顺序。编译器告诉你,因为&(*id)
是const Movie*
,所以你不能将它分配给Movie*
。如果你绝对坚持这样做——很明显,你不应该这样做,因为这似乎是为了让你尝试双重删除东西而存在的大量努力和混乱——你可以改变Movie *pointers[100][100];
到 const Movie *pointers[100][100];
【参考方案1】:
pointers[(*id).movieId][(*id).shopId] = &(*id);
尝试在pointers
中存储指向Movie
的指针,指向setMovie
。
现在考虑在您执行此操作后会发生什么。如果你这样做了:
pointers[42][43]->priceId = 44;
这可能会使布景无效(您可能有两次相同的电影)。这就是为什么set
不允许你这样做。
一种方法是:
const Movie *pointers[100][100];
然后,您可以存储指针,因为在法律上不允许您修改电影并弄乱排序。我不确定这是否是一个好主意,但它会解决您当前的问题。
对于 2,不,在指向存储在集合中的电影的指针上调用 delete 不是一个好主意。你没有在这个对象上调用 new,所以你不应该删除它。如果你尝试,你会立即崩溃,或者更晚。
【讨论】:
谢谢,但让我解释一下。通过添加 const 解决了问题。但是现场有擦除功能。所以我们可以删除一个项目。也许我需要使用 Heap,priority_queue。但我需要删除一个项目并可能再次添加它。所以我不想每次都迭代来找到它并删除它。这是我的主要技巧和想法。如果它以编程方式工作,那对我来说就足够了。但是我必须再次删除电影(0,10)并再次添加,多次添加删除。我使用 Set 或任何 LOG(N) 数据结构来执行一些与此问题无关的搜索功能,但我必须这样做。再次感谢 好的,这说明了这一点,但不要使用delete
这个词,除非你的意思是delete
。它在 C++ 中具有非常特殊的含义。如果您打算调用 set.erase
并引用要删除的对象,它可能会起作用。仍然没有说这是一个很好的设计,但我并不是说它会崩溃,如果你的意思是 erase
而不是 delete
以上是关于无法分配给 C++ 中的指针数组的主要内容,如果未能解决你的问题,请参考以下文章