C ++:static一次初始化一个数组成员,成员

时间:2011-01-27 13:41:55

标签: c++ arrays static initialization

我现在可以在全球范围内做到这一点,一切正常:

const char* Foo::bars[3] = {"a", "b", "c"};

但我想这样做是因为这更加清晰和自我记录(特别是如果你使用Enums作为索引):

const char* Foo::bars[3];
bars[0] = "a";
bars[1] = "b";
bars[2] = "c";

无论如何可能吗?

我知道我可以在函数内部(例如,类的构造函数)执行此操作但是如果在程序的开头没有调用构造函数并且我想使用静态数组呢?这会导致问题。

5 个答案:

答案 0 :(得分:7)

这个怎么样?

const char* Foo::bars[3] = {
/* Index    Value */
/* 0 */     "a",
/* 1 */     "b",
/* 2 */     "c"
};

我经常使用这种“技术”来使结构数组的初始化看起来像一个自我记录的电子表格。

答案 1 :(得分:1)

在C ++中,没有等效的static Java块。

如果你真的想自动初始化数组,你可以创建一个简单的类来完成这项工作:

// in .cpp
class FooInitializer {
public:
    FooInitializer() {
        Foo:bars[0] = "a";
        Foo:bars[1] = "b";
        Foo:bars[2] = "c";
    }
};

static FooInitializer fooInitializer;

答案 2 :(得分:0)

您可以使用访问者功能:

const char* GetArray()
{
    static char* result[3];
    static isInitialized = false;
    if (!isInitialized)
    {
        result[0] = "a";
        result[1] = "b";
        result[3] = "c";
        initialized=true;
    }
    return result;
}

答案 3 :(得分:0)

这是使用Singleton模式的另一种解决方案。请注意,数组在singleton的构造函数中初始化一次。另请注意,这不是线程安全的。还要注意单身人士的邪恶(搜索这个网站的“单身人士”,就这件事找到一些有趣的辩论)。

#include <iostream>

class StringTable
{
public:
    enum StringId
    {
        hello,
        bye,
        goodDay,
        stringCount
    };

    static const char* lookup(StringId id) {return instance().table_[id];}

private:
    StringTable()
    {
        table_[hello] = "Hello World!\n";
        table_[bye] = "Goobye, cruel world!\n";
        table_[goodDay] = "I said good day!\n";
    }

    static StringTable& instance()
    {
        static StringTable theInstance;
        return theInstance;
    }

    const char* table_[stringCount];
};


int main()
{
    std::cout << StringTable::lookup(StringTable::hello)
              << StringTable::lookup(StringTable::bye)
              << StringTable::lookup(StringTable::goodDay);
}

答案 4 :(得分:0)

你可能想要一个额外的const吧?

const char* const Foo::bars[3] = 
{
   "a",
   "b",
   "c"
};

你声明它的方式,你实际上可以做你想要的一次一个成员,虽然你使用“init”函数来做。

如果你确实想要const,这可能是最好的,那么一次为它们分配一行就会变得非法,即使在某种“init”方法中也是如此,你应该简单地使用代码布局来使它更清晰你在做什么。