4

次のような通信用ライブラリを使用するクラスがあります。

class Topic {
  Topic( Type T, String name );
};

class Reader {
  Reader (Topic, String name);
};

class Writer {
  Writer (Topic, String name);
};

私は次のような話者クラスを作りたいです:

Talker (Type T, String name);

そして、コンストラクターでメンバー Writer と Reader を生成します。

私はポインタでそれを行うことの間で引き裂かれています:

class Talker {
  Topic* m_Topic;
  Reader* m_Reader;
  Writer* m_Writer;

  Talker (Type T, String name) {
    m_Topic = new Topic (T, generateTopicName(name));
    m_Reader = new Reader (m_Topic, generateReaderName(name));
    m_Writer = new Writer (m_Topic, generateWriterName(name));
  }
};

直接対:

class Talker {
  Topic m_Topic;
  Reader m_Reader;
  Writer m_Writer;


  Talker (Type T, String name) :
    m_Topic(T, name),
    m_Reader(m_Topic, generateReaderName(name)),
    m_Writer(m_Topic, generateWriterName(name))
  {}
};

私は同僚と話していましたが、メンバーの初期化順序に依存しているため、後者は明らかに悪いです。ただし、動作する自動コピー コンストラクターもあります。

特にメンバー オブジェクトのリストが長くなる場合、このようなことを行うより良い方法は何ですか?

4

3 に答える 3

5

このような決定は、無効な議論であるため、同僚が提案する議論に基づくべきではありません。オブジェクトメンバーを使用しても、初期化の順序を制御できます。最後の段落を参照してください。決定は以下に基づく必要があります。

1)機能的-ポリモーフィックタイプが必要ですか?TopicReaderそしてWriter継承されますか?はいの場合は、オブジェクトのスライスを防ぐためにポインタを使用する必要があります。

2)論理メンバー(オブジェクト)の真の所有者ですかTalker、それとも複数のクラス間で共有されているいくつかのオブジェクトを指しているだけですか?

古い答え

別の方法は、メンバーとして代わりにスマートポインターを使用することです。このようにして、自動メモリ管理の利点を引き続き利用できます。

ただし、C ++を知っている場合は、同僚の引数は無効であり、後者のオプションは悪くありません。メンバーは、で宣言されている順序で初期化されますclass。したがってm_Topic、最初、m_Reader2番目、最後に初期化されますm_Writer。初期化の順序が重要な場合(コードの臭い)、クラス定義のメンバーを並べ替えるだけです。

于 2012-03-26T18:54:39.640 に答える
0

これらのクラスをどのように使用するかによって大きく異なりますが、一般に、ヒープの割り当てが少ないほど良いので、これらすべてのクラスが含まれているコンストラクターに眉をひそめる傾向がありnewます。メンバーの初期化順序への依存は本当に問題ですか?なぜそうあるべきなのか、私には想像もつきません。

ポインターを使用する場合はstd::unique_ptr、標準的な選択であるスマートなポインターを使用するのが合理的です。

于 2012-03-26T18:56:01.017 に答える
0

それは本当にあなたの要件に依存します

ポインタバージョンはより柔軟です

  • オブジェクトがnullになる可能性があります
  • オブジェクトを交換したり、持ち去ったりすることができます

しかし

  • 正しい破棄に注意する必要があります(わかりました、スマートポインタが役立ちます)
  • 32ビットメモリ環境では、少なくとも3 * 4バイトのメモリが必要です。おそらく、メモリ管理の実装の詳細が原因で、数値が2倍になる可能性があります。小さなものがたくさんあると痛い

ポインターモデルはかなり

  • 車とホイールの状況(交換可能)

メンバーモデルはかなり

  • 家と部屋の状況(家を変更せずに部屋を削除することはできませんでした)
于 2012-03-26T19:11:14.190 に答える