2

私は次のようなコードを少し書きました:

Asteroid *a = new Asteroid( asteroidCollection ) ;

そして、変数は必要ないことがわかりましaた。Asteroidコンストラクターでは、new Asteroidが自分自身をasteroidCollection.

だから私は書くことができるようになりました:

new Asteroid( asteroidCollection ) ;

返品も必要ないのに、これは悪いスタイルですか?作ろうかな

asteroidCollection->createNew() ;

または

asteroidCollection->add( new Asteroid() ) ;

?

4

4 に答える 4

8

コードを読むと混乱するので、スタイルが悪いと思います。最初に頭に浮かぶのは、メモリ リークがあることです。混乱は、コンストラクターの内部を調べて、オブジェクトが後で削除されるリストに自分自身を追加することを理解した後にのみ蒸発します。

また、考えられる例外シナリオについても考えてください。割り当てられたオブジェクトをある種のスマート ポインターに格納してから、コレクションに追加することをお勧めします。

于 2012-10-10T02:43:29.243 に答える
5

あなたの質問に、私は好むだろう

asteroidCollection->add( new Asteroid() ) ;

他の 2 つのスタイルより。

new Asteroid( asteroidCollection ) ;次のようなものよりも優れているわけではないため、1stよりも優れています

Foo( barCollection ); 

ここで、Foo はクラスでありnew、そのコンストラクターで Bar オブジェクトを作成してコレクションに追加すると、何が起こっているのかわかりにくくなります。

また、2番目よりも優れています。IMOは の作成asteroidCollection方法を気にする必要がないためです。これはコレクションであるため、コレクションが行うことを行います。Asteroid

于 2012-10-10T02:58:01.020 に答える
1

スタイルに関する質問は常に少し主観的です。ですから、ある意味で私は彼らに答えるのが好きです。これは私の2セントです...

Asteroidコレクションから派生したオブジェクトを作成し、それらをコレクションに追加できるようにしたいことを少し考えてみてください。add()メソッドがたまたま仮想関数である (または使用する) 関数を呼び出した場合、Asteroidまだ完全に構築されていないオブジェクトにアクセスする可能性があります。

コンストラクターでこのようなアクションを実行し、何が起こっているのかをユーザーに理解させるのは混乱していると思います。

単純な関数を作成することをお勧めします。クラスの一部である必要さえありません...

Asteroid *CreateAsteroid( AsteroidCollection *coll )
{
    Asteroid * a = new Asteroid();
    coll->add(a);
    return a;
}

コンストラクターのアプローチにとどまりたい場合は、少なくとも元のコード行をこの関数に入れ、何が起こっているかを非常に明確に説明してコメントすることができます。

基本的に裏で面白いことはしないようにしています。そして、それが避けられない場合 (または何らかの形で望ましい場合) は、コーダーがあなたであろうと他の誰かであろうと、コーダーに奇妙さを理解させないようにしてください。

少なくともこの場合、それほど奇妙ではありません。事態はさらに悪化する可能性があります!=)

最後の2つの例を挙げると...

  1. asteroidCollection->createNew();

  2. asteroidCollection->add( new Asteroid() );

Asteroid作成されるのは常に 1 つのタイプであり、クラスのユーザーに心配させたくない場合は、番号 1 が良いと思います。コレクション間で を共有できない場合はAsteroid、これを行うのが理にかなっています。これは私が提案した関数に似ていますが、コレクション クラスがサポート コードを提供しないようにします。

番号 2 は、派生型を格納できる場合、Asteroidまたはコレクションに追加する前に小惑星に特別なことをしたい場合に役立ちます。これは、3 つのアプローチすべての中で最も柔軟です。

于 2012-10-10T02:58:48.860 に答える
0

小惑星の寿命は誰が管理しているのでしょうか。

小惑星のユーザーとコレクションの間で本当に共有されているかどうか。

小惑星コレクションに入れずに小惑星を作成することが不可能な場合、コレクションがライフタイムを所有します。

スタックに小惑星を作成するとどうなりますか? new を直接呼び出す代わりに、その小惑星を unique_ptr または shared_ptr に貼り付けるとどうなりますか。

auto asteroid = std::make_shared(asteroidCollection)

2回削除されますか?

誰にも小惑星を操作させたくない場合は、小惑星コレクションのメソッド createAsteroid または addAsteroid がおそらくより適切です。メソッド createNew を呼び出すだけで、新しい AsteroidCollection を作成しているように聞こえますが、これは意図したものではないと思います。

于 2012-10-10T02:58:07.567 に答える