繁体   English   中英

const_cast用于对象向量

[英]const_cast for vector with object

我知道const_cast删除对象的常数是不好的,

我有以下用例,

//note I cannot remove constness in the foo function
foo(const std::vector<Object> & objectVec) {

   ...
   int size = (int) objectVec.size();
   std::vector<Object> tempObjectVec;
   //Indexing here is to just show a part of the vector being
   //modified
   for (int i=0; i < (int) size-5; ++i) {
       Object &a = const_cast<Object&> objectVec[i];
       tempObjectVec.push_back(a);
   } 
   foo1(tempObjectVec);
}  

如果我在foo1中更改tempObjectVec对象,ObjectVec中的原始对象是否会更改,因为我正在传递引用,所以我说“是”,这样更有效。 您能建议替代方法吗?

好吧,这取决于对象。 但是,当您将对象传递给push_back时,它们正在被复制。 您可以通过在复制构造函数中添加一些调试代码来进行检查。 因此,如果Object行为良好,并且将不同的副本分开,那么foo1可以更改向量,它会得到所有喜欢的东西。

一种更有效的方法是让foo1接受开始和结束迭代器:

void foo1(std::vector<Object>::const_iterator start,
          std::vector<Object>::const_iterator end);

...
foo1(objectVec.begin(), objectVec.end() - 5);

如果您不使用const_cast,则类型系统将确保foo1不会更改任何元素,因为它们是const_iterators。

您的tempObjectVec不能是引用的向量,因此我认为应将其声明为以下形式:

std::vector<Object> tempObjectVec;

当您执行tempObjectVec.push_back(a) ,将创建对象的副本以将其推入tempObjectVec向量。 由于这是一个副本,因此您甚至不需要使用const_cast删除常量,我不清楚您为什么需要这样做。

我相信这是您要寻找的声明:

const_cast<std::vector<Object>&> (objectVec)这将返回对非const std::vector的引用,该引用应该适合foo1(我假设)。

修改原始示例:

foo(const std::vector<Object> & objectVec) {

    ...
    foo1(const_cast<std::vector<Object> &>(objectVec));
}

但是,我确实建议您查看foo1的实际要求,该要求要求它使用非常量向量,因为您似乎表明您有兴趣的所有人都在修改Object实例本身。

正如其他人已经说过的那样,向量的push_back接受了引用,但是随后它复制了引用的对象。 因此,最后您得到tempObjectVecobjectVec[i]tempObjectVec

向量不能存储引用,因为它们不能被分配(分配给它不影响引用本身,而是影响被引用的对象),这是将对象保存在向量中的要求。 引用也不是对象。 他们没有自己的大小。 因此不能将它们推入数组或任何向量中。 通常,您希望将指针或智能指针存储在这样的容器中以引用其他对象。 查看看起来像您想要的boost pointer container库。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM