スタイルに関する質問は常に少し主観的です。ですから、ある意味で私は彼らに答えるのが好きです。これは私の2セントです...
Asteroid
コレクションから派生したオブジェクトを作成し、それらをコレクションに追加できるようにしたいことを少し考えてみてください。add()
メソッドがたまたま仮想関数である (または使用する) 関数を呼び出した場合、Asteroid
まだ完全に構築されていないオブジェクトにアクセスする可能性があります。
コンストラクターでこのようなアクションを実行し、何が起こっているのかをユーザーに理解させるのは混乱していると思います。
単純な関数を作成することをお勧めします。クラスの一部である必要さえありません...
Asteroid *CreateAsteroid( AsteroidCollection *coll )
{
Asteroid * a = new Asteroid();
coll->add(a);
return a;
}
コンストラクターのアプローチにとどまりたい場合は、少なくとも元のコード行をこの関数に入れ、何が起こっているかを非常に明確に説明してコメントすることができます。
基本的に裏で面白いことはしないようにしています。そして、それが避けられない場合 (または何らかの形で望ましい場合) は、コーダーがあなたであろうと他の誰かであろうと、コーダーに奇妙さを理解させないようにしてください。
少なくともこの場合、それほど奇妙ではありません。事態はさらに悪化する可能性があります!=)
最後の2つの例を挙げると...
asteroidCollection->createNew();
asteroidCollection->add( new Asteroid() );
Asteroid
作成されるのは常に 1 つのタイプであり、クラスのユーザーに心配させたくない場合は、番号 1 が良いと思います。コレクション間で を共有できない場合はAsteroid
、これを行うのが理にかなっています。これは私が提案した関数に似ていますが、コレクション クラスがサポート コードを提供しないようにします。
番号 2 は、派生型を格納できる場合、Asteroid
またはコレクションに追加する前に小惑星に特別なことをしたい場合に役立ちます。これは、3 つのアプローチすべての中で最も柔軟です。