繁体   English   中英

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

[英]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 *> (指向常量对象的指针的向量)。

  1. 常量的“第一级”( 指针常量)自然是通过在向量上返回常量引用来实现的。 只有const_iterator可以从一个const矢量来获得,所以你必须保证该指针将不会被修改(但指针对象可以)。

  2. 常数的“第二级”( 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM