我专门处理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相同......
无论如何,还有其他方法吗?让我知道你们的想法......谢谢。
答案 0 :(得分:6)
Iterator pattern通常被认为是一种正确的方法,可以将集合中的元素列表暴露给集合的实际内部表示。您可以创建迭代器,使其返回只读(const)引用,或者在请求时动态复制项目,而不是复制整个列表。
答案 1 :(得分:2)
您可以将const引用返回到列表而不是指针(或只是指向const的指针)。客户端仍然可以构建它,但这将是他们自己的问题。
const list<int>& GetList() const { return *_myItems; }
答案 2 :(得分:0)
只需返回列表的副本:
list<int> GetList() { return *_myItems; }
不要过早优化。这是万恶之源。