Как объявить постоянный массив в классе с постоянной переменной класса? - PullRequest
3 голосов
/ 12 ноября 2011

Как объявить постоянный массив в классе с постоянной переменной класса?Является ли это возможным.Мне не нужен динамический массив

Ответы [ 3 ]

5 голосов
/ 12 ноября 2011

Нет, это невозможно: пока size является динамической переменной, array[size] невозможно реализовать в виде статического массива.

Если хотите, подумайте об этом следующим образом: sizeof(test) должен быть известен во время компиляции (например, рассмотрим массивы test).Но sizeof(test) == sizeof(int) * (1 + size) в вашем гипотетическом примере, который не является известным значением во время компиляции!

Вы можете сделать size параметром шаблона;это единственное решение:

template <unsigned int N>
class Test
{
  int array[N];
  static const unsigned int size = N; // unnecessary really
public:
  // ...
};

Использование: Test<50> x;

Обратите внимание, что теперь у нас есть sizeof(Test<N>) == sizeof(int) * (1 + N), что равно на самом деле известно время компиляциизначение, потому что для каждого N, Test<N> есть отдельный тип.

2 голосов
/ 12 ноября 2011

Вы имеете в виду массив фиксированного размера?Вы можете использовать std::array следующим образом:

#include <array>

class test
{
    static const size_t s_size = 50;
    std::array<int, s_size>   m_array;
public:
    test()
    {
    }
};

Или, если вы хотите поддерживать разные размеры, вам нужно прибегнуть к шаблону класса, подобному этому:

#include <array>

template <size_t SIZE>
class test
{
    std::array<int, SIZE>   m_array;
public:
    test()
    {
    }
};

std:array имеетдополнительное преимущество хранения информации о размере вместе с элементом (в отличие от массивов, которые распадаются на указатели) и совместимо со стандартными библиотечными алгоритмами.

Существует также версия, которую предлагает Boost ( boost ::массив ) который похож.

1 голос
/ 12 ноября 2011

Ваш код выдает ошибку, потому что компилятор должен знать размер типа данных каждого члена.Когда вы пишете int arr[N] тип члена arr - это «массив из N целых чисел», где N должно быть известным числом во время компиляции.

Одно решение использует enum:

class test
{
    enum 
    {
        size = 50
    };

    int arr[size];
   public:
    test() {}
};

Еще одно объявление размера как статического константного члена класса:

class test
{
    static const int size = 50; 
    int arr[size];
   public:
    test(){}
};

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

...