Статический константный инициализированный структурный массив в классе C ++ - PullRequest
0 голосов
/ 05 января 2011

Я понимаю, что если я хочу использовать массив const в пространстве имен классов в C ++, я не могу сделать:

class c
{
private:
  struct p
  {
    int a;
    int b;
  };
  static const p pp[2];
};

const c::p pp[2] =  { {1,1},{2,2} };

int main(void)
{
  class c;
  return 0;
}

Я должен сделать:

class c
{
public:
  struct p
  {
    int a;
    int b;
  };
  static const p pp[2];
};

const c::p pp[2] =  { {1,1},{2,2} };

int main(void)
{
  class c;
  return 0;
}

Но для этого требуется "p" и«pp» будет публичным, когда я хочу, чтобы они были приватными.Разве в C ++ нет способа инициализировать частные статические массивы?

РЕДАКТИРОВАТЬ: ------------------- Спасибо за ответы.Кроме того, я хочу, чтобы этот класс был библиотекой, только для заголовочных файлов, для использования основным проектом.Включение следующего инициализатора приводит к ошибкам «множественного определения» при включении в несколько файлов.

const c::p c::pp[2] =  { {1,1},{2,2} };

Как я могу решить эту проблему?

Ответы [ 3 ]

9 голосов
/ 05 января 2011

Ваш первый фрагмент кода работает нормально. Вам просто нужно изменить его на:

const c::p c::pp[2] =  { {1,1},{2,2} };
2 голосов
/ 05 января 2011

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

Вместо этого вы полностью удаляете структуру из видимости, помещая ее и экземпляр в анонимное пространство имен модуля компиляции, где находятся ваши функции класса.

Пользователи класса не должны видеть детали реализации.

Исключением может быть ситуация, когда struct или закрытой статической функции-члену необходим доступ к закрытым членам класса. Если это так, вам нужно, по крайней мере, объявить его существование в качестве друга в заголовке класса, так что вы ничего не потеряете, объявив его статическим, как только вам придется показать, что он там есть.

0 голосов
/ 05 января 2011

Вам необходимо пройти квалификацию pp с c::, как в

const c::p c::pp[2] = { {1,1},{2,2} };

В противном случае вы пытаетесь определить новый массив в глобальной области вместо инициализации члена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...