web-dev-qa-db-ja.com

すべての参照を初期化する方法は?

私は最近別の開発者とプロジェクトを取りましたが、彼は彼の参照を初期化する特定の方法を持っています。

class Player
{
    private:
        Console &console;
        Armor &armor1, &armor2;
        Debugger &debugger;
        sf::RenderWindow &window;
        sf::Event &event;

   public:
       Player(Console &console, Armor &armor1, ...) : console(console), armor1(armor1), ... {};
}

そして、それは私にはまったく問題ありませんが、新しいものを追加するとどうなりますか?私たちのコンストラクターは巨大であり、面倒なので、大規模なプロジェクトがある場合、参照を初期化するより良い方法があるかどうか知りたいと思います。実際に。

3
Bugster

参照は再バインドできないため、参照型のメンバーはコンストラクターの初期化リストでのみ初期化できます。ですから、あなたが書いたようにコンストラクターで初期化する必要があります。それが唯一の方法です。

これは2つのポイントを持ち出します:

  1. クラスは大きすぎませんか?
  2. それらは実際に参照によって保持されるすべての注入された依存関係ですか? 「プレイヤー」クラスは、「アーマー」のようなものを所有する必要があるように見えます。それはそれを(できればスマートな)ポインタで保持し、それ自体を構築します。
4
Jan Hudec

このメソッドは、C++でプロパティを初期化するための良い方法です。

プロパティの順序は初期化されることに注意してください。

C構造体を使用する場合は、以下を使用できます。

struct Obj   
obj={.a="a",.b="b"}; 

すべてのプロパティを初期化します。

CはC++より優れていると思います。
C++には多くのトラップがあります。

0
Edward Shen