2

パート1:私は非常に奇妙な状況にあります。そこでは、main()の前、またはmain()に入るとすぐに呼び出されるいくつかのクラスのコンストラクターを取得する必要があります。このサブシステムのデータをできるだけ早くmain()で開始する必要がある別のサブシステムがあり、この概念をより便利に見せるためにさらに多くのものがあります。

ここには2つのアプローチがあります。

  1. main()の前にグローバルオブジェクトを使用します。

  2. main()の最初の行で静的クラス定義を使用します。

もう1つのアイデアは、(gccを使用しているので)attribute __constructor__gcc予約関数を使用することです。

あなたは何を提案しますか?

パート2:この問題をさらに追加するには、これらのクラスの開発を切り離す必要があります(これはコードベースの設計の問題です)。

つまり、誰かがclassAを作成し、他の誰かがclassBを作成している場合、 classAclassBを含む2つの別個のファイルが定義され、ファイル/モジュール内で独自のコンストラクターが呼び出されます

これは私の考えを説明するサンプルコードです:

class Init_myclass
{
public:
  Init_myclass(): myvar(10)
  {
    std::cout << __PRETTY_FUNCTION__ << ":" << myvar << std::endl;
  };
private:
  int myvar;
};

static Init_myclass TestInit; //Initializing object prior to main
int main ()
{
  std::cout << __PRETTY_FUNCTION__ << std::endl;
  //Use the data populated by the Init_myclass constructor
  return 0;
}

上記のコードで、Init_myclassをclassA、classBなどの数百のクラス定義に置き換えます。

もう1つのアプローチは、ファイル内の単一のコンストラクターを使用して、他のファイルで定義されている複数のクラスコンストラクターを内部から呼び出すことです。

これが私の考えを理解するのに役立つかもしれないサンプルコードです:

class InitializeOne
{
public:
  InitializeOne(): myvar(10)
  {
    std::cout << __PRETTY_FUNCTION__ << ":" << myvar << std::endl;
    A bunch of constructors of other classes here();
    classA();
    classB();
    ....
  };
private:
  int myvar;
};

int main()
{
static InitializeOne TestInit;//Object after main
... //functions depending on data populated by Initialize constructor 
}

クラスの初期化順序は重要ではありませんが、mainの前、またはmainに入るとすぐに初期化する必要があります。

どのデザインがより好ましいのか、そしてその理由は?

私の質問を理解できるようにしたいと思います。そうでない場合は、私が見逃した、または過度に単純化/複雑化した情報などを知らせてください。

お返事と時間をありがとうございました。

4

1 に答える 1

1

可能であれば、アプローチ 2 を選択する必要があります。

シングルトン クラスを 1 つ作成します。

class InitializeOnce {

public:
    static InitializeOnce& getInstance()
    {
        static InitializeOnce theInstance;
        return theInstance;
    }

    virtual ~InitializeOnce() {}

    classA& getClassA() { return classA_; }
    classB& getClassB() { return classB_; }

private:
    classA classA_;
    classB classB_;

    InitializeOnce()
    : classA_()
    , classB_()
    {
    }

    InitializeOnce(const InitializeOnce& rhs); // Prohibit copying!
    InitializeOnce& operator=(const InitializeOnce& rhs); // Prohibit assigning!
};

...そしてメインから一度アクセスします:

int main()
{
    static InitializeOnce& theInstance = InitializeOnce::getInstance();

    // ... functions depending on data populated by Initialize constructor 
}

アプローチ 1 の場合、これは次のようになります。

static InitializeOnce& theInstance = InitializeOnce::getInstance();

int main()
{

   // ... functions depending on data populated by Initialize constructor 
}

関数ローカル静的変数は、少なくとも最初のアクセスの前にインスタンス化されることが保証されているため、提案されたアプローチは異なる動作になります。main() が呼び出される前に
本当にアクセスする必要がある場合は、アプローチ 1 を選択する必要があります。

IMHO あなたの 3 番目のアイデアは避けるべきです。コンパイラ固有の属性定義 (gcc であっても) は、コードの移植性を低下させます。

于 2013-02-26T18:33:36.853 に答える