![](/img/trans.png)
[英]how-to initialize 'const std::vector<T>' like a c array
[英]How-to return a const std::vector<Object *const>?
我有一个包含容器(包含指针)的类作为成员:
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_iterator
可以从一个const矢量来获得,所以你必须保证该指针将不会被修改(但指针对象可以)。
常数的“第二级”( pointee常数)很难获得。 如其他人已经指出的,要么返回向量的新实例:
return std::vector<const MyObject *>(_VecMyObjs.begin(), _VecMyObjs.end());
或者,如果适用,尝试查看Boost Pointer容器库(最著名的是ptr_vector ),该库除其他外提供正确的constness传播:
传播constness,使人们无法通过const_iterator修改对象。
您必须了解,在向量上返回const引用可确保无法对其进行修改(不得插入,删除或修改其值)。 因此,在大多数情况下,返回const std::vector<T> &
是方法,因为if不涉及任何复制。 这里的问题实际上是特定于指针容器的,其中值的恒定性不提供指针的恒定性。
如果要返回一个新的vector
,请不要使其为const
。 将const
关键字放在*
之前。
std::vector<MyObject const*> MyClass::GetVecMyObj()
{
return std::vector<MyObject const*>(_VecMyObjs.begin(), _VecMyObjs.end());
}
我没有转换为TRoadSgmt
因为您没有指定此类的继承。
假设非const指针的向量在整个生命周期中都位于某个地方,那么您将使用const-version,因此您不需要复制,如果它们很多,则您不想复制向量,最好返回某种定制的包装对象,只给用户const-access。
向量的第一个元素的地址将为T **,并且您不能将其强制转换为const T **(正确),也不能将其强制转换为const T * const *(这很安全,但是语言不会允许它)。
如果允许您转换后者,则非常适合创建只读视图。
除了更改签名以从vector
删除const
(因为它是vector
的副本)之外,我还假设您不希望外界的人修改内容,因此,请创建const
指针,即
vector<const MyObject *> ACI_CALL MyClass::GetVecMyObjs()
{
return vector<const MyObject *>(_VecMyObjs.begin(), _VecMyObjs.end());
}
现在返回的向量是一个副本,其中包含const指针(这意味着您无法通过此指针修改指向的对象)-嗯,这就是协议,没有什么阻止有人const_cast
放弃这一点(无论如何都使用UB!)
如果您确实想防止修改,请在向量中返回一个副本(或每个对象的副本)。
const vector<const MyObject *> MyClass::GetVecMyObjs() const
{
return vector<const MyObject *>(_VecMyObjs.begin(), _VecMyObjs.end());
}
这似乎是我的解决方案。 我现在可以告诉我,这要归功于我得到的所有不同职位。 谢谢大家! 有一个好人...(或让我知道,如果我在某个地方还是错的。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.