C++ 我想把一个指向常量对象的指针放入一个包含非常量指针的容器中。我有什么选择?
我有一些代码如下所示:C++ 我想把一个指向常量对象的指针放入一个包含非常量指针的容器中。我有什么选择?,c++,constants,C++,Constants,我有一些代码如下所示: void addPtrs(vector<Thing*> & ThingPtrs, const vector<Thing> & actualThings) { for (const Thing & t : actualThings) if (/*some condition*/) ThingPtrs.push_back(&t); } void addP
void addPtrs(vector<Thing*> & ThingPtrs, const vector<Thing> & actualThings) {
for (const Thing & t : actualThings)
if (/*some condition*/)
ThingPtrs.push_back(&t);
}
void addPtrs(向量和ThingPtrs、常量向量和实际值){
用于(常数和t:实际值)
如果(/*某些条件*/)
东西:推回(&t);
}
基本上,我想修改ThingPtrs
,方法是给它提供指向Thing
s的指针,这些指针有一些条件。但是,因为我不想修改实际的对象
,我将实际值
标记为常量
,现在我无法将常量
指针分配给非常量
指针
显然,一个解决方案就是不做实际值
常量
,但实际上我并不打算修改它。另一个解决方案是使用const\u cast
,但如果可能的话,我也希望避免这种情况
在这种情况下我有什么选择 根据设计,
const std::vector
将不允许您直接修改它的元素。由于actualThings
是常量,因此无法修改其内容。任何指向其元素的引用或指针都将是常量
在不改变函数原型的情况下找到的任何解决方案最终都会涉及将常量对象&
或常量对象*
转换为其非常量等效对象,无论您如何修饰它。任何指针转换或重新解释都只是循环的const\u cast
如果您担心
addPtrs
不会修改actualThings
(在调用它的非常量成员的意义上),您可以更改接口以接受一对开始/结束迭代器。允许您的函数编译的其他更改包括从actualThings
中删除常量以获得vector&actualThings
或将常量添加到ThingPtrs
中的元素类型中以通过设计获得vector&ThingPtrs,const std::vector
将不允许您直接修改其元素。由于actualThings
是常量,因此无法修改其内容。任何指向其元素的引用或指针都将是常量
在不改变函数原型的情况下找到的任何解决方案最终都会涉及将常量对象&
或常量对象*
转换为其非常量等效对象,无论您如何修饰它。任何指针转换或重新解释都只是循环的const\u cast
如果您担心addPtrs
不会修改actualThings
(在调用它的非常量成员的意义上),您可以更改接口以接受一对开始/结束迭代器。允许您的函数进行编译的其他更改包括从actualThings
中删除常量以获得向量和实际值
,或者在ThingPtrs
中的元素类型中添加常量以获得向量和ThingPtrs,如果您从未打算修改任何对象
,您的ThingPtrs
将被定义为std::vector&
。看到它存储了非常量
指针,这意味着在某一点上需要进行一些修改,因此您不需要任何常量
属性。我打算修改东西
s,但只能通过实际操作
而不是东西
。我可以将ThingPtrs
定义为向量
类型吗?@Dillydill123是的,如果您将ThingPtrs
更改为向量
,那么您的函数应该可以很好地编译。如果您从未打算修改任何对象
,那么您的ThingPtrs
将被定义为std::vector&
。看到它存储了非常量
指针,这意味着在某一点上需要进行一些修改,因此您不需要任何常量
属性。我打算修改东西
s,但只能通过实际操作
而不是东西
。我可以将ThingPtrs
定义为vector
类型吗?@Dillydill123是的,如果您将ThingPtrs
更改为vector
,那么您的函数应该可以很好地编译。因此我尝试了vector
,对此我感到惊讶。当向量
达到容量时,它必须重新生成其容器,这是如何允许的?我还注意到vector
不能编译。@Dillydill123这种方法不能防止无效。如果/当actualThings
调整大小时,它确实会中断。发生这种情况时,所有指向元素的指针和引用以及所有迭代器都将失效。常量指针并不保证指向的对象不能更改,只是不能使用指针更改它。关于您的另一个问题,请参阅以了解有关指针类型上可以放置常数的不同位置的更多信息。@Dillydill123关于注释中的第二个问题,只是为了确保您知道const X*
/X const*
与X*const
之间的区别,对吗?(指向常数X的指针vs指向常数X的指针)是的,我知道!我相信我理解为什么我们不能让vector
纠正我的错误,但它不会编译,因为在创建const指针时需要初始化它,如果它位于vector内部则不会这样。现在这又给了我一个问题!我们可以做地图吗?看来这应该行得通@Dillydill123int*const
是指向可变(非常量)int
的指针,初始化后无法将其分配给新地址。它仍然存在与vector
相同的问题,您无法将const int*
分配给它。它还有一个新的问题,因为它要求T
be。所以我尝试了vector
,我对这个编译结果感到惊讶。当向量
达到容量时,它必须重新加载,这是如何允许的