2012-03-13 3 views
5

У меня есть класс, как этотобъект переменного размера не может быть инициализирован

class aClass 
{ 
    public: 
    aClass() : N(5) {} 
    void aMemberFunction() 
    { 
     int nums[N] = {1,2,3,4,5}; 
    } 
    private: 
    const int N; 
}; 

Код тестирования

int main() 
{ 
    aClass A; 
    A.aMemberFunction(); 

    const int N = 5; 
    int ints[N] = {5,4,3,2,1}; 
    return 0; 
} 

Когда я компилирую (г ++ 4.6.2 20111027), я получаю ошибку

problem.h: In member function ‘void aClass::aMemberFunction()’: 
problem.h:7:31: error: variable-sized object ‘nums’ may not be initialized 

Если я закомментируйте строку с int nums[N] я не получаю ошибку компиляции, поэтому подобный код для ints массив в порядке. Разве не значение N известно во время компиляции?

Что происходит? Почему nums считается массивом переменного размера? Почему массивы nums и ints обрабатываются по-разному?

+1

В массивах C++ требуются постоянные выражения для их размера. то есть она должна быть константой времени компиляции, но N в вашем примере инициализируется динамически, но до литерала. – AraK

+0

Обратите внимание, что 'gcc' фактически поддерживает массивы переменной длины в C++ как расширение, которое вы просто [не можете их инициализировать] (http://stackoverflow.com/a/27339171/1708801) –

ответ

9

Не указано значение N во время компиляции?

No. В то время aMemberFunction компиляции, компилятор не теперь, что N есть, так как его значение определяется во время выполнения. Это не достаточно разумно, чтобы видеть, что существует только один конструктор, и предполагает, что значение N может быть иным, чем 5.

+0

Спасибо, это имеет смысл. – stardt

+0

Компилятор C++ выглядит недостаточно умным для меня, но многие другие языки основного потока могут поддерживать инициализацию массива в пути ints [N]. –

3

N не известно во время компиляции в вашем примере, но он находится в этом примере:

class aClass 
{ 
    private: 
    static const int N = 5; 
    public: 
    aClass() {} 
    void aMemberFunction() 
    { 
     int nums[N] = {1,2,3,4,5}; 
    } 
}; 

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

+0

Есть ли способ создать переменный массив? Мне нужно, чтобы он удерживал X-число ints, в зависимости от того, что вводит пользователь, я не знаю, что они будут вводить, поэтому он имеет * переменную. – MarcusJ

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