从对象中获取项目集合的最佳实践?

时间:2009-08-03 00:23:30

标签: c++ oop

我专门处理C ++,但这与语言无关。

只是给出一些问题的背景...我有一个基于树/图的结构,其中每个节点都包含多个项目的集合。

我有一个类封装了一些通用集合(list,map,vector,LinkedList,等等)。我希望能够以最有效的方式从该集合中获取所有项目,而无需客户端编辑私有集合。

以下是我所拥有的简化示例:

class MyClass
{
public:
    // Basic constructors and such
    void AddItem(int item) { _myItems->push_back(item); }

private:
    list<int>* _myItems;
};

显然,检索指向_myItems的指针的getter不起作用,因为这将允许客户端编辑_myItems。

尝试1:
我可以创建一个新列表并返回指向该列表的指针......但是我不喜欢这个想法,因为现在创建和删除的责任在于不同的对象。

尝试2:
我认为最好创建一些CopyTo方法,例如:

void CopyItemsToList(list<int>* inList) { // copy the items to client list }

这样,客户端负责内存管理,很容易扩展它以允许更多的数据结构。我对这种方法的关注是成本......列表可能非常大,复制项目的成本可能会很高

尝试3:
不要保持指向类中列表的指针,只需使用值类型并返回(让复制构造函数处理它)。但是,这似乎是性能成本与#2相同......

无论如何,还有其他方法吗?让我知道你们的想法......谢谢。

3 个答案:

答案 0 :(得分:6)

Iterator pattern通常被认为是一种正确的方法,可以将集合中的元素列表暴露给集合的实际内部表示。您可以创建迭代器,使其返回只读(const)引用,或者在请求时动态复制项目,而不是复制整个列表。

答案 1 :(得分:2)

您可以将const引用返回到列表而不是指针(或只是指向const的指针)。客户端仍然可以构建它,但这将是他们自己的问题。

const list<int>& GetList() const { return *_myItems; }

答案 2 :(得分:0)

只需返回列表的副本:

list<int> GetList() { return *_myItems; }

不要过早优化。这是万恶之源。