我有一个以容器(包含指针)作为成员的类:
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 上使用了赋值函数。有一个更好的方法吗?我的意思是,我当然不希望 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>
(常量指针 vector )真的是你想要的:我相信你的意思是std::vector<MyObject const *>
(指向常量对象的指针的 vector )。
constness(pointer constness)的“第一级”自然是通过返回 vector 上的常量引用来实现的。只有
const_iterator
可以从 const vector 中获得,因此您可以保证指针不会被修改(但pointees 可以)。constness 的“第二层”(pointee constness)更难获得。正如其他人已经指出的那样,要么返回一个新的 vector 实例:
return std::vector<const MyObject *>(_VecMyObjs.begin(), _VecMyObjs.end());
或者,如果适用,请尝试查看 Boost Pointer Container库(最著名的是 ptr_vector ),除其他外,它提供正确的常量传播:
Propagates constness such that one cannot modify the objects via a const_iterator.
您必须明白,返回 vector 上的 const 引用可以保证它不能被修改(不能插入、删除或修改其值)。所以,在大多数情况下,返回一个 const std::vector<T> &
是要走的路,因为如果不涉及任何复制。这里的问题确实特定于指针容器,其中值的常量性不提供指针对象的常量性。
关于c++ - 如何返回 const std::vector<Object *const>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4449227/