2008-11-26 6 views
10

Мне было интересно, можно ли объявить массив (размер которого неизвестен в данный момент), как частный член класса, а затем установить размер в конструкторе класса. Например:Объявление массива C++ в заголовке

class Test { 
int a[]; 
public: 
Test(int size); 
}; 

Test::Test(int size) { 
a[size]; // this is wrong, but what can i do here? 
} 

Возможно ли использовать или использовать динамические массивы? Благодаря!

ответ

13

Нет это невозможно. Объявления массива в заголовках должны иметь постоянную величину. В противном случае конструкции, такие как «sizeof», будут функционировать должным образом. Вам нужно объявить массив как тип указателя и использовать new [] в конструкторе. Пример.

class Test { 
    int *a; 
public: 
    Test(int size) { 
     a = new int[size]; 
    } 
    ~Test() { delete [] a; } 
private: 
    Test(const Test& other); 
    Test& operator=(const Test& other); 
}; 
3

Прежде всего, лучше инициализировать вещи в списке инициализации конструктора, а не в теле конструктора.

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

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

17

Короткий ответ: Нет (Размер массива не определяется во время компиляции только)
Long Ответ:

Вы можете использовать вектор для достижения того же результата:

class Test 
{ 
    std::vector<int> a; 
    public: 
     Test(std::size_t size): 
      a(size) 
     {} 
}; 
+0

Я хочу, чтобы люди добавляли комментарии при маркировке ответов. По крайней мере, вы вернулись к 0 – JaredPar 2008-11-26 20:52:59

+1

Ненависту нравится ненавидеть анонимно. Ненавидьте ненавистников! Я даю вам точку. – 2008-11-26 21:00:29

+0

+1 Для хорошего практического ответа, если у кого-то есть проблемы с ним, объясните почему (чтобы мы могли показать вам, что Мартин прав) – orip 2008-11-26 21:04:50

0

Нет, это невозможно. Вы должны использовать динамический массив, такой как std::vector. C99 позволяет структуре иметь несигнализированный массив как только , только, но даже когда вы это делаете, вам все равно придется вручную выделять память самостоятельно, например. с malloc().

4

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

template <int N> class Test { 
    int a[N]; 
public: 
    Test() { } 
}; 

Test<5> test; 
Test<40> biggertest; 

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

0

То, о чем вы говорите, невозможно. Классы всегда имеют постоянный размер. Вы могли бы использовать в своем классе указатель на динамически выделенный массив, или вы могли бы использовать std :: vector.

2

См решение Мартина (используйте std::vector), и помните, что даже если вам нужно передать буфер в C API std::vector позволяет сделать это путем передачи &vec[0]:

std::vector<char> vec(10); 
memset(&vec[0], 0, vec.size()); 

Это гарантированно работать, но только если вектор не пуст (C++ quirks, < sigh>).

Смежные вопросы