2012-08-06 10 views
18

Tengo una situación que se puede resumir en lo siguiente:inicializar una matriz de tamaño constante en una lista de inicialización

class Test 
{ 

    Test(); 

    int MySet[10]; 

}; 

es posible inicializar MySet en una lista de inicialización?

gusta esta clase de lista de inicialización:

Test::Test() : MySet({1, 2, 3, 4, 5, 6, 7, 8, 9, 10}) {} 

¿Hay alguna forma para inicializar una matriz miembro constante de tamaño en la lista initalizer de una clase?

+3

por lo que vale la pena, 'Set' no es sólo un puntero a una array de enteros '10', ni' static' aquí. Más bien, el nombre de la matriz 'Set' se descompone en un puntero al primer elemento de la matriz en ciertas situaciones. La diferencia se puede ver claramente usando 'sizeof' - es decir' sizeof (Set) == 10 * sizeof (int)! = Sizeof (int *) '. –

+1

@StuartGolodetz Gracias por la aclaración. Cuando dije estático, quise decir estático en la forma en que está almacenado con el objeto/instancia, y no solo en otro lugar en el montón. Por supuesto, ese es un gran uso indebido del término "estático" de mi parte; lo siento. – Serge

+0

No te preocupes :) Solo intentaba aclarar la distinción entre matrices y punteros con la posibilidad de que hubiera habido un malentendido allí. –

Respuesta

21

Si bien no está disponible en C++, C++ 03 11 introduce listas de inicializador extendidos. De hecho, puede hacerlo si usa un compilador que cumpla con el estándar C++ 11.

struct Test { 
    Test() : set { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } { }; 
    int set[10]; 
}; 

El código anterior compila bien utilizando g++ -std=c++0x -c test.cc.


Como se ha señalado por debajo de mí por un usuario muy útil en los comentarios, este código no compila usando VC++ de Microsoft compilador, cl. Tal vez alguien me puede decir si el equivalente que usa std::array lo hará?

#include <array> 

struct Test { 
    Test() : set { { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 } } { }; 
    std::array<int, 10> set; 
}; 

Esto también compila bien utilizando g++ -std=c++0x -c test.cc.

+2

¡Otra buena razón para amar a C++ 11 (o algunas partes de él)! = D ¡Muchas gracias! – Serge

+0

@Serge no hay problema! – oldrinb

+5

Tenga en cuenta que este código no se compila con Visual C++ versión 11 y anterior (es decir, no se compila con Microsoft Visual Studio 2012 y Visual C++ es el compilador principal de la plataforma más común). Entonces, ** si quieres código portátil, no hagas esto **. Todavía. –

4

Desafortunadamente, en C++ 03, no puede inicializar matrices en las listas de inicializadores. Se puede en C++ 11, aunque si su compilador es más nuevo :)

véase: How do I initialize a member array with an initializer_list?

+1

Incluso C++ 98 admitía la inicialización cero de las matrices en las listas de inicializadores. –

3

"Entiendo que Set es sólo un puntero a la matriz estática de 10 enteros"

No, eso está mal: es una matriz, no un puntero.

Aún puede inicializarlo en la lista de inicializadores del constructor.

Para un compilador que no es compatible con C++ 11 rizado llaves de inicialización (Visual C++ versión 11 y anteriores viene a la mente) que tendrá que saltar a través de algunos aros, aunque, como se muestra a continuación:

#include <iostream> 
#include <vector> 
using namespace std; 

#define CPP11 
#if defined(_MSC_VER) 
# if (_MSC_VER <= 1700) 
#  undef CPP11 
# endif 
#endif 

#ifdef CPP11 
class Cpp11 
{ 
private: 
    int set_[10]; 

public: 
    Cpp11() 
     : set_{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } 
    {} 

    int foo() const { return set_[3]; } 
}; 
#endif 

class Cpp03 
{ 
private: 
    struct IntArray10 { int values[10]; }; 
    IntArray10 set_; 

    static IntArray10 const& oneToTen() 
    { 
     static IntArray10 const values = 
      { {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} }; 
     return values; 
    } 

public: 
    Cpp03() 
     : set_(oneToTen()) 
    {} 

    int foo() const { return set_.values[3]; } 
}; 

int main() 
{} 

en lugar de utilizar matrices primas, sin embargo, utilizar std::vector y C+++ 11 std::array, ambos de los cuales son apoyados incluso por Visual C++ 11.

Cuestiones relacionadas