其他分享
首页 > 其他分享> > c-如何返回const std :: vector?

c-如何返回const std :: vector?

作者:互联网

我有一个包含容器(包含指针)的类作为成员:

MyClass{
private:
   std::vector<MyObject*> _VecMyObjs;
public:
   const std::vector<MyObject* const> GetVecMyObj();
}

现在,我尝试实现GetVecMyObj().这是我想出的…

const vector<MyObject *const> ACI_CALL MyClass::GetVecMyObjs()
{
   const vector<MyObject *const> VecMyObjs;
   VecMyObjs.assign( _VecMyObjs.begin(), _VecMyObjs.end());
   return VecMyObjs;
}

但是,当然,编译器警告我,我在const-Object上使用了assign-function.有一个更好的方法吗?我的意思是,我当然不希望VecMyObjs在类之外更改VecMyObj.在没有编译器警告的情况下如何实现?

编辑:
好的.谢谢大家.现在是这样的:

const vector<MyObject *const> ACI_CALL MyClass::GetVecMyObjs()
{
   const vector<MyObject *const> VecMyObjs;
   VecMyObjs.assign( _VecMyObjs.begin(), _VecMyObjs.end());
   return VecMyObjs;
}

但是,我无法绕过分配功能,对吗?例如.如果我希望“所有内容”保持不变,则强制转换“原始内容”无效.

解决方法:

我不确定std :: vector< MyObject * const> (常量指针的向量)确实是您想要的:我相信您的意思是std :: vector< MyObject const *> (指向常量对象的指针的向量).

>通过在向量上返回常量引用,自然可以实现“第一级”(指针常量).从const向量只能获取const_iterator,因此可以保证不会修改指针(但可以更改指针).
>常数的“第二级”(指针常数)很难获得.如其他人已经指出的,要么返回向量的新实例:

return std::vector<const MyObject *>(_VecMyObjs.begin(), _VecMyObjs.end());

或者,如果适用,尝试查看Boost Pointer Container库(最著名的是ptr_vector),该库除其他外提供正确的constness传播:

Propagates constness such that one
cannot modify the objects via a
const_iterator.

您必须了解,在向量上返回const引用可确保无法对其进行修改(不得插入,删除或修改其值).因此,在大多数情况下,返回const std :: vector< T> &安培;之所以走,是因为如果不涉及任何复制.这里的问题实际上是特定于指针容器的,其中值的恒定性不提供指针的恒定性.

标签:c,const,stl,encapsulation
来源: https://codeday.me/bug/20191013/1908833.html