2012-03-08 28 views
0

C++では、main()で初期化する必要があるオブジェクトをグローバルに持つ必要があるため、プログラム全体の他の関数からアクセスできるようにするにはどうすればよいでしょうか?デストラクタが正しく呼び出されるように呼び出されていることを確認してください。あなたはoperator->経由メンバーにアクセスさせたくない場合はグローバル変数のC++初期化

+0

あなたはヒープ上にオブジェクトを割り当てていますか? – Adrian

答えて

4
struct foo {}; 

foo *x_ptr; 

int main() { 
    foo x; 
    x_ptr = &x; 
    // the rest 
} 

またstd::reference_wrapperを使用することができます。

しかし、実際には、そうしないでください。グローバルにするのではなく、必要な場合はそれを渡します。

void needs_foo1(foo&); 
void needs_foo2(foo&, int, int, int); 

int main() { 
    foo x; 
    needs_foo1(x); 
    needs_foo2(x, 1, 2, 3); 
    // et cetera 
} 
+1

彼が言っている理由は、何か変更できるグローバル変数を持つことは、どのエンティティがそれを変更しているのかわからない複雑なシステムでは本当に危険になる可能性があるからです。本当にデバッグするのが難しくなる可能性があります。 – sparkFinder

3

「グローバル」は要件ではなく解決策であると考えられます。それはあなたが常に明示的にあなたのオブジェクトを渡すことが示唆されているように。

私がおそらくshared::ptrを使用したい場合は、Singleton実装でラップされている可能性があります。 shared_ptrは、プログラムの起動時にnullに初期化され、main()の有効な値に設定されます。

他のグローバル変数に依存するグローバル変数がある場合、破壊の問題が発生する可能性があることに注意してください。シングルトンパターンの欠点についての巨大な文献もあります。

+0

はい、グローバルが必須であるとは思いません。ちょうど1つを作って周りに渡してください。依存関係について明示してください。 –

関連する問題