ここで2つの無関係な問題:
1)のインスタンスで、必要なインスタンスをどのようSomeObject
に管理しBigObject
ますか?の各インスタンスにSomeObject
独自のが必要な場合BigObject
、BigObject
データメンバーは完全に合理的です。別のことをしたい場合もありますが、そのような状況が発生しない限り、単純な解決策に固執してください。
2)ユーザーにSomeObject
直接アクセスを許可しますBigObject
か?デフォルトでは、適切なカプセル化に基づいて、ここでの答えは「いいえ」になります。しかし、あなたが望むのであれば、それは(1)の評価を変えることはありません。また、必要に応じて、必ずしもポインタを介して行う必要はありません。参照またはパブリックデータメンバーを介して行うこともできます。
(1)の評価を変更する3番目の考えられる問題が発生する可能性があります。
3)ユーザーが、取得したインスタンスの存続期間を超えて使用し続けるSomeObject
インスタンスに直接アクセスできるようにしますか?もしそうなら、もちろんデータメンバーは良くありません。適切な解決策は、または呼び出されるたびに異なる値を返すファクトリである可能性があります。BigObject
SomeObject
shared_ptr
SomeObject::getFooBar
BigObject
要約すれば:
- コンパイルされない(
getFooBar()
戻る必要がconst BigObject*
ある)という事実を除けば、これまでのところ、このコードが間違っていると考える理由はありません。それを間違える他の問題が発生する可能性があります。
const &
よりも戻る方が良いスタイルかもしれませんconst *
。どちらを返すかは、データメンバーfoobar
である必要があるかどうかには関係ありません。BigObject
foobar
ポインタやスマートポインタを作成することについて「ただ」ということは確かにありません。どちらかBigObject
を指すインスタンスを作成するには、追加のコードが必要になります。