【问题标题】:What is best way to return readonly with changeable objects?使用可变对象返回只读的最佳方法是什么?
【发布时间】:2012-02-04 16:26:57
【问题描述】:

我有一个对象容器,我只想返回它们的只读列表,因为对象是在容器中管理的。

class Object;

class Container {
public:
   typedef list<Object*> Objects;

   // first method, probably slow
   Objects getObjects() { return this->objects; }
   // another method, but i don't know if it isn't lacking somewhere else
   Objects::iterator getObjectsIt() { return this->objects.begin(); }
   // OR any better method exists ??

private:
   Objects objects;
};

【问题讨论】:

  • C++ 中通常不需要说this-&gt;。这不是 Java 或 PHP :-)
  • 我知道,但我喜欢写this。 ;)
  • 我不太明白你想要什么:没有从列表中添加/删除对象,或者已经包含的对象没有被更改?
  • This answer 对这个想法的自相矛盾进行了一些有趣的讨论。如果可以更改元素,则只需重新分配元素即可更改列表。 究竟你想要什么是不可变的?列表的大小?好的,这已经解决了。列表中的成员,但不是他们的数据?从自定义迭代器返回的代理对象可能是可行的......

标签: c++


【解决方案1】:

您可能有一种特殊类型的迭代器,它与您的 list 的成员函数不兼容,它使用迭代器来改变列表,以便您可以通过迭代器访问对象,但不能将它们传递给更改的函数他们所属的列表。

假设迭代器不记得它们来自哪个容器。如果他们这样做了,那么只需让那个特殊的迭代器类没有可以改变其父容器的函数。

【讨论】:

    【解决方案2】:

    返回 const_iterator 并声明方法 const。

    【讨论】:

    • 但是对象应该是长乐。 const_iterator 不会影响吗?
    • 现在我很困惑。你想要什么?如果您只公开迭代器,您已经无法改变容器,那么您当前的代码有什么问题?
    • @Miro 您想要一个可更改对象的只读列表,因此您希望能够更改对象而不是列表?
    猜你喜欢
    • 2012-01-12
    • 2011-04-12
    • 1970-01-01
    • 2011-09-05
    • 2012-03-31
    • 2012-10-23
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    相关资源
    最近更新 更多