这取决于...
这取决于您希望您的类封装多少,以及您想要隐藏或显示什么。
我看到的代码对我来说似乎没问题。你是对的,如果另一个数据/迭代器的修改/删除,std::list 的数据和迭代器不会失效。
现在,返回指针将隐藏您使用 std::list 作为内部容器的事实,并且不会让用户浏览其列表。返回迭代器可以让类的用户更自由地浏览这个列表,但他们会“知道”他们正在访问一个 STL 容器。
这是你的选择,我猜。
请注意,如果它 == std::list<>.end(),那么这段代码会有问题,但我想你已经知道了,这不是本次讨论的主题。
不过,我在下面总结了一些替代方案:
使用const
将有助于...
您返回一个非常量指针的事实使您的对象的用户可以静默地修改他/她可以得到的任何 MyContainedClass,而无需告诉您的对象。
取而代之或返回一个指针,您可以返回一个 const 指针(并为您的方法添加 const 后缀)以阻止用户在不使用您批准的访问器的情况下修改列表中的数据(一种setElement
?)。
const MyContainedClass * getElement() const {
// ...
std::list<MyContainedClass>::const_iterator it = ... // retrieve somehow
return &(*it);
}
这将在一定程度上增加封装。
参考资料呢?
如果您的方法不能失败(即它总是返回一个有效的指针),那么您应该考虑返回引用而不是指针。就像是:
const MyContainedClass & getElement() const {
// ...
std::list<MyContainedClass>::const_iterator it = ... // retrieve somehow
return *it;
}
不过,这与封装无关.. :-p
使用迭代器?
为什么不返回迭代器而不是指针?如果对您来说,上下导航列表是可以的,那么迭代器会比指针更好,并且使用方式大多相同。
如果要避免用户修改数据,请将迭代器设为 const_iterator。
std::list<MyContainedClass>::const_iterator getElement() const {
// ...
std::list<MyContainedClass>::const_iterator it = ... // retrieve somehow
return it;
}
好的一面是用户将能够浏览列表。不好的一面是用户会知道它是一个 std::list,所以......