2017-01-04 10 views
0

ある.ccファイル内のオブジェクト内に静的ポインタを宣言し、そのポインタを関数で別の.ccファイル内の2番目の静的ポインタに戻すことは安全かどうかですか?私は、file_a.ccとfile_b.ccに2つの静的ポインタを持っていますが、file_a.ccで宣言された同じオブジェクトを指し示す関数をfile_b.ccのポインタに使用します。私は何か悪いことをしているように感じます。私ですか? foo()とprint_object()を呼び出すと、1が出力されるので、ポインタは同じオブジェクトを指しています。スタティックオブジェクトへのポインタを返す

/** file_a.h */ 
#ifndef FILE_A_H 
#define FILE_A_H 

struct Object { 
    int value = 0; 
} 

Object* get_object(); 

void print_object(); 

#endif 


/** file_a.cc */ 
#include "file_a.h" 

static Object* object = new Object(); 

Object* get_object() { 
    return object; 
} 

void print_object() { 
    std::cout << object->value << std::endl; 
} 


/** file_b.h */ 
#ifndef FILE_B_H 
#define FILE_B_H 

#include "file_a.h" 

void foo(); 

#endif 


/** file_b.cc */ 
#include "file_b.h" 

static Object* object = get_object(); 

void foo() { 
    object->value += 1; 
} 
+0

これは私にとってはシングルトンパターンの少し修正されたバージョンのようです(実際のシングルトンパターンを使用していない理由はわかりません)。シングルトンと同じ落とし穴/潜在的な問題もあります(いくつかの議論や詳細へのリンクについては、[この質問](http://stackoverflow.com/questions/1008019/c-singleton-design-patternを参照))。 – UnholySheep

+0

ええ、私はそれがかなりシングルトンだと思います。私はそのパターンに従うことに着手せず、自分自身で試していたので、そんなことは考えていませんでした。 – Exudes

+0

あなたが他のファイルのオブジェクトのinitializationof * order *に頼っていない限り、あなたは良いはずです –

答えて

0

2つの異なるインスタンスと2のソースファイルの結果で、同じ名前の2つのstatic変数を宣言。

1

ここには本当に悪いことはありません。コンパイル単位には2つの異なる静的ポインタがありますが、どちらも同じオブジェクトを指しています。

オブジェクトがアクセサー機能の外部で作成されているため、単純に一般的なパターンではありません。このコードは、より一般的です:

Object* get_object() { 
    static Object* object = new Object(); 
    return object; 
} 

オブジェクトのみget_objectおよび標準保証を介してアクセスすることができるので、それは、オブジェクトがアクセサ関数の最初の呼び出し時に作成されることを少しよりよいカプセル化を提供しています - それだけで提供します1つのスレッドで初期化されています...

+0

これは 'static Object * obj; if(!obj)obj =新しいObject(); 'obj'を一度しかビルドしたくないからでしょうか? –

+0

@BasileStarynkevitch:AFAIK、 'static Object * object = new Object();'は静的初期化であり、一度だけ実行されます。私はどこか間違っていますか? –

関連する問題