[英]C++: static initialize an array member, member at a time
我現在可以在全球范圍內做到這一點,一切正常:
const char* Foo::bars[3] = {"a", "b", "c"};
但我想這樣做是因為這更加清晰和自我記錄(特別是如果你使用Enums作為索引):
const char* Foo::bars[3];
bars[0] = "a";
bars[1] = "b";
bars[2] = "c";
無論如何可能嗎?
我知道我可以在函數內部執行此操作(例如,類的構造函數)但是如果在程序的開頭沒有調用構造函數並且我想使用靜態數組呢? 這導致了問題。
這個怎么樣?
const char* Foo::bars[3] = {
/* Index Value */
/* 0 */ "a",
/* 1 */ "b",
/* 2 */ "c"
};
我經常使用這種“技術”來使結構數組的初始化看起來像一個自我記錄的電子表格。
在C ++中,沒有static
Java塊的等價物。
如果您真的想自動初始化數組,可以創建一個簡單的類來完成工作:
// in .cpp
class FooInitializer {
public:
FooInitializer() {
Foo:bars[0] = "a";
Foo:bars[1] = "b";
Foo:bars[2] = "c";
}
};
static FooInitializer fooInitializer;
您可以使用訪問者功能:
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;
}
這是使用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);
}
你可能想要一個額外的const吧
const char* const Foo::bars[3] =
{
"a",
"b",
"c"
};
你聲明它的方式,你實際上可以做你想要的一次一個成員,雖然你使用“init”函數來做到這一點。
如果你確實想要const,這可能是最好的,那么一次為它們分配一行就會變得非法,即使在某種“init”方法中,你應該簡單地使用代碼布局來使它更清楚你是什么這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.