場合によります...
それは、クラスをどの程度カプセル化するか、および何を非表示または表示するかによって異なります。
私が見るコードは私には問題ないようです。std::list のデータとイテレータが別のデータ/イテレータの変更/削除の場合に無効にされないという事実については正しいです。
ここで、ポインターを返すと、 std::list を内部コンテナーとして使用しているという事実が隠され、ユーザーがそのリストをナビゲートできなくなります。イテレータを返すと、クラスのユーザーはこのリストをより自由にナビゲートできますが、STL コンテナーにアクセスしていることを「認識」します。
それはあなたの選択です。
== std::list<>.end() の場合、このコードで問題が発生することに注意してください。ただし、すでにそのことを知っていると思いますが、これはこの議論の主題ではありません。
それでも、以下に要約する代替手段があります。
を使用const
すると役立ちます...
非 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 であることを知っていることです。