2009-08-03 68 views
1

我正在专门处理C++,但这实际上是与语言无关的。从对象中获取项目集合的最佳实践?

只是为了给问题一些上下文......我有一个基于树/图的结构,其中每个节点拥有多个项目的集合。我有一个封装了一些泛型集合(列表,地图,矢量,LinkedList,无论)的类。我希望能够以最有效的方式从该集合中获取所有项目,而无需客户端能够编辑私有集合。

这里是什么,我有一个简单的例子:

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

private: 
    list<int>* _myItems; 
}; 

所以,很显然这检索指针_myItems不起作用,因为这将允许客户端编辑_myItems一个getter。

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

尝试2:
我想这将是最好创建一些CopyTo从方法,如:

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

这样,客户端负责MEM管理的,很容易扩展这允许更多的数据结构。我的这种做法值得关注的是成本......这个列表可能会非常大,而且复制项目的成本能得到大

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

反正,有什么其他的方式去解决这个问题?让我知道你们在想什么......谢谢。

回答

6

Iterator pattern通常被认为是一个合适的方法,以便将来自集合不可知论的元素列表展示给集合的实际内部表示。你可以创建你的迭代器,以便它返回只读(const)引用,或者在请求时即时创建项目副本,而不是复制整个列表。

+0

const_terator然后,所以客户端不能修改元素本身,如果这是要求。 – Eugene 2009-08-03 00:32:52

+0

正确;更新的答案是更清楚一点。 – Amber 2009-08-03 00:34:04

2

你可以将const引用返回给你的列表而不是指针(或者只是指向const)。客户仍然可以强制转换,但这会是他们自己的问题。

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

只返回列表的副本:

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

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