2012-07-04 4 views
1

Мне нужно инициализировать статический массив. Не все значения являются последовательными.Инициализировать разреженный статический массив

Что-то вроде этого отлично работает для последовательного массива:

class Foo { 

    public: 

    static const char * name[]; 

} 

const char * Foo::name[] = { "Sun", "Moon" }; 

Как я могу присвоить значения в произвольных позициях в массиве? Мне нужно сделать что-то вроде этого (псевдокод):

const char * Foo::name[] = { 67: "Sun", 68: "Moon" }; 

Массив никогда не будет больше 255; индексы исходят из значений байтов.


Я нашел part of a thread где кто-то дает пример нечто похожее на то, что я хочу, но я не мог получить что-нибудь подобное, чтобы работать.

type array[SIZE] = {[SIZE-4]=1, 2, 3, 4}; 
+0

'[SIZE-4] = 1' называются обозначенными intializers и доступны только на C и незаконны в C++ (однако в gcc они предлагают его как расширение). Однако нетривиальные (т. Е. Ваш пример) не поддерживаются. –

ответ

1

Вот одна старая школа подход:

class NameArray { 
    public: 
    NameArray() 
    { 
     array[67] = "Sun"; 
     array[68] = "Moon"; 
    } 

    const char *operator[](size_t index) const 
    { 
     assert(index<256); 
     return array[index]; 
    } 


    private: 
    const char * array[256]; 
}; 

class Foo { 
    public: 
    static NameArray name; 
}; 

NameArray Foo::name; 

обертыванием массив в классе, вы можете убедиться, что он получает построен со значениями, которые вы хотите. Вы также можете выполнять проверку границ.

+0

Должен ли NameArray быть синглом, если я собираюсь это сделать? –

+0

@GGG: Если однотонный вы имеете в виду удаление возможности копирования или назначения, убедитесь, что это то, что вы хотите. –

+0

Я имею в виду, что на самом деле это не имеет никакого преимущества быть статичным, я думал, что одноэлементный паттерн может это исправить, но он кажется излишним. Я просто хочу простой статический разреженный массив. Нет ли способа сделать это? –

4

Я хотел бы предложить вам использовать std::map<int, std::string> (или unordered_map, если у вас есть поддержка C++ 11) вместо массива. Затем вы можете вставить эту карту с кодом: m[67] = "Sun" и получить предметы, используя std::string s = m[67];.

+0

Спасибо, но я хотел бы сделать это, не импортируя больше библиотек, если это возможно. –

+2

@GGG: Это часть стандартной библиотеки C++. Не требуется дополнительных библиотек. – Naveen

+0

Это будет отличаться от остальной части кода. Почему вы предлагаете использовать std :: strings вместо const char *? Код написан c-подобным образом, инкапсулированный в классы. –