是否可以以编程方式创建函数静态对象?

时间:2012-02-16 15:14:22

标签: c++

我需要创建一个向量来保存指向某些静态对象的指针(例如,a1,a2,a3)。

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在表达式中没有任何影响,因为对象被破坏了,正如我期望的那样是正常的临时。

4 个答案:

答案 0 :(得分:7)

函数静态对象只能由具有名称的定义声明创建。你不能像那样创建一个“函数 - static临时”。

怎么样:

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

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

否则,除了采用动态存储对象之外你别无选择,只能以编程方式控制在任何给定范围内存在的唯一对象(尤其是因为它们不是真正范围根本)。实际上,对于动态存储持续时间的对象,这几乎是 用例。

答案 1 :(得分:0)

除非您的静态对象存储在数组中,否则不能。

答案 2 :(得分: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]));
    }
}

答案 3 :(得分: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"
}