2012-02-16 14 views
1

いくつかの静的オブジェクト(たとえば、a1、a2、a3)へのポインタを保持するベクトルを作成する必要があります。function-staticオブジェクトをプログラムで作成することはできますか?

void foo() 
{ 
    static TEST a1, a2, a3; 
    static vector<TEST *> m_test; 
    m_test.push_back(&a1); 
    m_test.push_back(&a2); 
    m_test.push_back(&a3); 
} 

しかし、staticオブジェクトごとに宣言を書き出す必要はありません。

これを行うにはどうすればよいですか?私のような何かを試してみました:

for (unsigned int i=0; i<10; i++) 
    { 
     m_test.push_back(&(static TEST())); 
    } 

をしかし、それは、オブジェクトが破壊され得るように私は通常、一時的に期待するようstaticは、式の中の任意の効果を持っていないようです。

+0

このマニフェスト自体をする方法は?予期しない動作を引き起こすコードを表示します。 –

+0

コンパイルしても驚いています –

答えて

7

ファンクション静的オブジェクトは、名前を持つ定義宣言によってのみ作成できます。そのような "function-static temporary"を作成することはできません。彼らはしている

static const size_t N = 10; 
static TEST tests[N]; 

for (size_t i = 0; i < N; i++) { 
    m_test.push_back(&tests[i]); 
} 

そうでない場合、あなたはダイナミック・ストレージ・オブジェクトに頼るせざるを得ない場合には、存在そのもの任意のスコープ内のオブジェクトのみをプログラムで制御することができます(ない少なくともので:についてどのように

は実際にはではありません)。実際には、これはかなりです動的ストレージ期間のオブジェクトのユースケースです。

0

静的オブジェクトが配列に格納されている場合を除き、できません。

0

これはあなたには適していますか?

void foo() 
{ 
    static TEST t[10]; 
    static vector<TEST *> m_test; 
    for (unsigned int i=0; i<10; i++) 
    { 
     m_test.push_back(&(t[i])); 
    } 
} 
0

代わりに個別TESTオブジェクトを宣言する、vectorTESTオブジェクトの宣言:

void foo() 
{ 
    static vector<TEST> a(3); 
    static vector<TEST *> m_test(3); 
    for(int i = 0; i < 3; i++) 
     m_test[i] = &a[i]; 

    // Of course, now you may discover that you didn't 
    // need "m_test" after all, you could just use "a" 
} 
関連する問題