2012-03-13 5 views
5

tengo una clase como estaobjeto de tamaño variable no puede ser inicializado

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

El código de prueba es

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

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

Cuando compilo (g ++ 4.6.2 20111027), consigo el error

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

Si comento hacia fuera de la línea con int nums[N] no consigo un error de compilación, por lo que el código similar para el ints matriz está bien. ¿No se conoce el valor de N en tiempo de compilación?

¿Qué está pasando? ¿Por qué se considera nums una matriz de tamaño variable? ¿Por qué las matrices nums y ints se manejan de manera diferente?

+1

En C++ las matrices requieren expresiones constantes para su tamaño. es decir, debe ser una constante en tiempo de compilación, pero N en su ejemplo se inicializa dinámicamente a través de un literal. – AraK

+0

Tenga en cuenta que 'gcc' en realidad admite matrices de longitud variable en C++ como una extensión que usted [no puede inicializar de esa manera] (http://stackoverflow.com/a/27339171/1708801) –

Respuesta

9

¿No es el valor de N conocido en tiempo de compilación?

No. En el momento aMemberFunction se compila, el compilador no hace ahora lo que es N, ya que su valor se determina en tiempo de ejecución. No es lo suficientemente inteligente como para ver que solo hay un constructor y supone que el valor de N podría ser diferente de 5.

+0

Gracias, eso tiene sentido. – stardt

+0

El compilador de C++ no parece lo suficientemente inteligente para mí, sin embargo, muchos otros lenguajes de flujo principal pueden admitir la inicialización de una matriz en el modo Ints [N]. –

3

N no se conoce en tiempo de compilación en su ejemplo, pero es en este:

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

El código anterior compilar y declarará una matriz local de cinco int s.

+0

¿Hay alguna manera de crear una matriz variable? Necesito que tenga una X cantidad de entradas, dependiendo de lo que ingrese el usuario, no tengo manera de saber en qué ingresarán, por lo que * tiene * que ser variable. – MarcusJ

Cuestiones relacionadas