проблема выделения статического массива! - PullRequest
0 голосов
/ 27 февраля 2010

Я хочу статически выделить массив. Посмотрите на следующий код, этот код неправильный, но он даст вам представление о том, что я хочу сделать

class array
{
  const int arraysize;
  int array[arraysize];//i want to statically allocate the array as we can do it by non type parameters of templates
public:
  array();
};

array::array():arraysize(10)
{
  for(int i=0;i<10;i++)
    array[i]=i;
}

main()
{
  array object;
}

Ответы [ 5 ]

2 голосов
/ 27 февраля 2010

Если размер вашего массива всегда один и тот же, сделайте его статическим членом. Статические члены, являющиеся целочисленными типами, могут быть инициализированы непосредственно в определении класса, например, так:

class array
{
  static const int arraysize = 10;
  int array[arraysize];

  public:
    array();
};

Это должно работать так, как вы хотите. Если размер массива не всегда одинаков для каждого объекта типа массив, вы не можете сделать это, и вам нужно будет использовать параметры шаблона, динамически распределить массив или использовать вместо него класс контейнера STL (например, std::vector).

2 голосов
/ 27 февраля 2010

Это должно быть сделано с использованием параметров шаблона, иначе sizeof(array) будет отличаться для каждого объекта.

Так бы вы делали, используя параметры шаблона.

template <int N>
class array
{
   int data[N];

   // ...
};

Или вы можете использовать std::vector, если не возражаете против динамического распределения.

0 голосов
/ 27 февраля 2010

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

class array
{
  int *p_array;

  public:
    array(int size);
};

array::array(int size)
{
p_array = malloc(size * sizeof(int));
}

Просто убедитесь, что вы очистили (т.е. в вашем дескрипторе есть p_array)

0 голосов
/ 27 февраля 2010

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

0 голосов
/ 27 февраля 2010

C ++ не допускает массивы переменной длины (то есть те, чьи размеры не являются константами времени компиляции). Разрешение одного в структуре сделает невозможным вычисление sizeof (массива), так как размер может отличаться от одного экземпляра к другому.

Попробуйте вместо этого использовать std :: vector, если размер известен только во время выполнения. Это также позволяет избежать сохранения размера массива в отдельной переменной. Обратите внимание, что выделение из кучи (например, с помощью std :: vector) также позволяет использовать большие массивы, поскольку доступное пространство стека очень ограничено.

Если вам нужна постоянная времени компиляции, возьмите параметр шаблона. Тогда вы должны искать Boost.Array, который уже реализует его.

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