Вопрос по c++, static, initialization, arrays – Инициализировать разреженный статический массив

1

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

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

class Foo {

  public:

  static const char * name[];

}

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

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

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

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

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

type array[SIZE] = {[SIZE-4]=1, 2, 3, 4};
[SIZE-4]=1 называются назначенными инициализаторами и доступны только в C и недопустимы в C ++ (однако в gcc они предлагают его как расширение). Однако нетривиальные (т. Е. Ваш пример) не поддерживаются. Jesse Good

Ваш Ответ

2   ответа
4

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

Это будет отличаться от остальной части кода. Почему вы предлагаете использовать std :: strings вместо const char *? Код написан в стиле c, инкапсулирован в классы. Dagg Nabbit
Спасибо, но я бы хотел сделать это, не импортируя больше библиотек, если это возможно. Dagg Nabbit
@GGG: вы можете использовать использоватьconst char*, Я предложилstd::string как люди обычно забываютconst частьchar* и использовать его как указатель не char * с такими функциями, какstrcpy, Это приведет к сбою программы.
@GGG: это часть стандартной библиотеки C ++, дополнительные библиотеки не требуются.
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;

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

Хм, хорошая мысль, я думал, что другие вещи должны будут создавать экземпляры NameArrays, но они просто смотрят на Foo :: name. Dagg Nabbit
Я имею в виду, что это не имеет такого преимущества, как статичность, я думал, что одноэлементный паттерн может это исправить, но это похоже на излишество. Я действительно просто хочу простой статический разреженный массив. Нет ли способа сделать это? Dagg Nabbit
@GGG: Если под синглтоном вы подразумеваете удаление возможности копирования или назначения, убедитесь, что это именно то, что вы хотите.
Должен ли NameArray быть единственным, если я собираюсь это сделать? Dagg Nabbit
@GGG: Я не уверен, что ты имеешь в виду. Он все еще объявлен как статический в классе Foo.

Похожие вопросы