Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我想把一个指向常量对象的指针放入一个包含非常量指针的容器中。我有什么选择?_C++_Constants - Fatal编程技术网

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内部则不会这样。现在这又给了我一个问题!我们可以做地图吗?看来这应该行得通@Dillydill123
int*const
是指向可变(非常量)
int
的指针,初始化后无法将其分配给新地址。它仍然存在与
vector
相同的问题,您无法将
const int*
分配给它。它还有一个新的问题,因为它要求
T
be。所以我尝试了
vector
,我对这个编译结果感到惊讶。当
向量
达到容量时,它必须重新加载,这是如何允许的