c++ - 如何返回 const std::vector<Object *const>?

标签 c++ stl constants encapsulation

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

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 )。

  1. constness(pointer constness)的“第一级”自然是通过返回 vector 上的常量引用来实现的。只有const_iterator可以从 const vector 中获得,因此您可以保证指针不会被修改(但pointees 可以)。

  2. 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/

相关文章:

C++ 无法将参数 1 从 'int**' 转换为 'const int **'

c++ - Orwell Dev C++ 不适用于 C++11

c++ - 如果没有发生错误,哪个 WinAPI 函数将最后一个错误设置为 ERROR_SUCCESS?

c++ - 如何将用户编译的共享库的共享库链接到 Debian 上的 c++ 应用程序?

c++ - 如何编译 CUDA C++ 项目

结构中带有 vector 的结构的 C++ vector 导致异常

安卓工作室 NDK : could not load library "libgnuSTL_shared.so"

c++ - 如何读取特定格式的文本文件c++

c++ - 如何让 const char* 函数工作?

Javascript:处理常量和跨浏览器兼容性