2011-01-27 51 views
4

我现在我可以在全球范围内做到这一点,一切工作正常:C++:静态初始化数组成员,成员在同一时间

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

但我想这样做,因为这是更清晰,自我记录(尤其是如果您使用枚举作为索引):

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

无论如何可能吗?

我知道我可以在一个函数(例如,类的构造函数)中做到这一点,但如果在程序的开始时没有调用构造函数并且我想使用静态数组呢?这会导致问题。

+2

为什么不应该调用构造函数? – Simone 2011-01-27 13:44:09

+0

OP希望Foo :: bars成为一个静态成员,并且它的元素被静态初始化(在执行main之前)。 – 2011-01-27 14:16:14

+1

@Emile是的,OP的第一行代码确实如此,只要`bars`被声明为静态的。构造函数将被调用,所以我想念整个讨论的观点。 – Simone 2011-01-27 14:24:59

回答

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; 
7

这个怎么样?

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

我经常用这个“技巧”,使结构的阵列的初始化看起来像一个自文档的电子表格。

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; 
} 
0

这里的另一种解决方案使用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); 
} 
0

你可能想在酒吧额外的常量

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

你宣布它的样子,你实际上可以做您设置的成员一次一个想要的东西,但你会使用“init”函数来做到这一点。

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