我有一个类,其中包含一个容器(包含指针)作为成员:
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 对象上使用了赋值函数。有一个更好的方法吗?我的意思是,我当然不希望 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 *>
(指向常量对象的指针向量)。
常量的“第一级”(pointerconstness)自然是通过返回向量上的常量引用来实现的。仅有的const_iterator
可以从 const 向量获得,因此您可以保证指针不会被修改(但是pointees可)。
-
常量的“第二层”(pointeeconstness)更难获得。正如其他人已经指出的那样,返回向量的新实例:
return std::vector<const MyObject *>(_VecMyObjs.begin(), _VecMyObjs.end());
或者,如果适用,请尝试调查Boost指针容器图书馆(最值得注意的是指针向量),除其他外,它提供了正确的常量传播:
传播常量,使得
无法通过a修改对象
常量迭代器。
您必须了解,返回向量上的 const 引用可以保证它不能被修改(不能插入、删除或修改其值)。因此,在大多数情况下,返回const std::vector<T> &
是要走的路,因为 if 不涉及任何复制。这里的问题实际上是指针容器特有的,其中值的常量性并不提供被指针的常量性。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)