0

これは古いテーマの別のバリエーションです。異なる翻訳単位での静的オブジェクトの初期化順序は定義されていません。

以下は、私の特定のシナリオの簡略化された例です。クラス G と F は非 POD タイプです。F が G に依存するということは、F のインスタンスを構築するには G のいくつかのインスタンスが必要であるという意味です (たとえば、F はアプリケーションが発行する何らかのメッセージであり、G のインスタンスはそのようなメッセージのコンポーネントである可能性があります)。

G.hpp

#ifndef G_HPP
#define G_HPP

struct G
{
    G() {} // ...
};

inline G operator+(G, G) { return G(); }

#endif

Gs.hpp

#ifndef GS_HPP
#define GS_HPP

#include "G.hpp"

extern const G g1;
extern const G g2;
extern const G g3;
extern const G g4;
extern const G g5;
extern const G g6;
extern const G g7;
extern const G g8;
extern const G g9;

#endif

Gs.cpp

#include "Gs.hpp"

const G g1;
const G g2;
const G g3;
const G g4;
const G g5;
const G g6;
const G g7;
const G g8;
const G g9;

F.hpp

#ifndef F_HPP
#define F_HPP

#include "G.hpp"

struct F
{
    F(G) {} // ...
};

#endif

Fs.hpp

#ifndef FS_HPP
#define FS_HPP

#include "F.hpp"

extern const F f1;
extern const F f2;
extern const F f3;

#endif

Fs.cpp

#include "Fs.hpp"
#include "Gs.hpp"

const F f1(g1 + g2 + g3);
const F f2(g4 + g5 + g6);
const F f3(g7 + g8 + g9);

operator+F のコンストラクターは、 G のインスタンスに適用した結果である引数を取り ます。F と G の両方のインスタンスはグローバル変数であるため、F のコンストラクターが必要とするときに G のインスタンスが初期化されているという保証はありません。

ここでの特殊性は、あちこちに多くの G と F があることです。F が必要なときはいつでも G の構築を強制しながら、構文を上記のコードに可能な限り近づけたいと思います。

4

3 に答える 3

1

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15から。

グローバル オブジェクトを、最初の使用時にオブジェクトを構築する関数に変更します。

// Gs.hpp
const G & g1();

// Gs.cpp
const G & g1() {
  static const G* g1_ptr = new G();
  return *g1_ptr;
}

// Fs.cpp
const F & f1() {
  static const F* f1_ptr = new F(g1() + g2() + g3());
  return *f1_ptr;
}

または、余分な s を追加するのが本当に我慢できない場合は()、いくつかの s を使用#defineしてそれらを非表示にします。

// Gs.hpp
const G & get_g1();
#define g1 (get_g1())
// Definition of get_g1() like g1() from prev. example
于 2010-09-29T22:25:36.337 に答える
0

たぶん、初期化に使用されたものと同様のトリックcinと友達のファイルバッファがあなたのために働くでしょうか?(<iostream>よくお読みください。)

于 2010-09-29T22:21:53.783 に答える
0

extern 宣言をヘッダーに保持します。fNとのすべてのgN定義を適切な順序で 1 つの cpp ファイルに入れます。

于 2010-09-29T22:18:09.627 に答える