返回不可变指针向量的C++函数语法

4
我有一个在MyClass中的C++函数,代码如下:


class MyClass {
public:
    std::vector<MyObject*> getVector();
};

我希望确保获取此集合的对象不会修改集合或其内容。应该使用什么适当的c++ const 用法来实现这一点? 编辑:我的意思是包括指针和它们所指向的内容。

1
你如何定义“内容”?是指针吗?还是指向的对象?这会产生很大的区别。 - David Rodríguez - dribeas
@DavidRodríguez-dribeas 感谢你指出这一点。问题已经更新。 - SundayMonday
也许你要找的是遍历这个列表的能力,而不是实际返回列表(它的副本)。保留类中包含的列表似乎意味着你想在类内部操作该列表,并且使调用者能够操作该列表。如果你解释一下类和调用者如何与列表交互,可能会有所帮助回答你的问题。 - ChuckCottrill
我删掉了我的回答,因为我觉得我们都在黑暗中摸索。为什么一开始要返回一个向量呢? - Fred Foo
@larsmans:我同意。整件事情都有点不对劲。也许一开始就问错了问题。我也要删除。 - John Dibling
感谢您对这位C++初学者的耐心指导和建议。我已经向管理员申请删除此问题,稍后我会提出更好的问题。 - SundayMonday
3个回答

4
std::vector<const MyObject *> getVector();

或者

const std::vector<const MyObject *> &getVector();

这应该能解决问题。您不需要指针是常量,只需要它们所指向的MyObject实例和std::vector对象是常量(如果返回引用),因此向量不会更改其状态,并且任何引用的项目都不会被公开为非const。


2
如果您不返回引用,则返回类型上的const是多余的。您无法控制调用者的副本是否为const。 - Benjamin Bannier
第二个版本需要在某处存储const指针向量(不能只将指针向量强制转换为const指针向量)。 - M.M

1
不确定是否正确。我只是使用了


class MyClass {
  std::vector<MyObject*> my_objects_;
 public:
  const std::vector<const MyObject*> &getVector() {
    return *reinterpret_cast<const std::vector<const MyObject *> *>(&my_objects_);
  }
};

做到这一点的技巧。

1

顺便提一下,std::vector<MyObject*> getVector() 将会返回该向量的一个副本,这符合面向对象编程原则(封装):

调用此getter将不允许改变MyClass实例的状态。

当然,从性能方面来看,这是一种不良的设计,除非你确实需要返回一个副本(对于getter而言是相当奇怪的规定)。因此,你应该返回一个const对象的引用,这同时允许返回对象本身(无需复制),同时禁止其被修改。


OP说他们不想允许指针所指向的对象被修改;而那个调用确实允许(你的建议也是如此)。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接