Pregunta

class C 
{
public:
 C() : arr({1,2,3}) //doesn't compile
{}
    /*
    C() : arr{1,2,3} //doesn't compile either
{}
    */
private:
 int arr[3];
};

Creo que la razón es que las matrices se pueden inicializar solamente con la sintaxis =, que es:

int arr[3] = {1,3,4};

Preguntas

  1. ¿Cómo puedo hacer lo que quiero hacer (que es decir, initialize una matriz en una constructor (no asignar elementos en el cuerpo)). ¿Es posible?
  2. ¿El C ++ 03 estándar digamos nada especial sobre la inicialización de agregados (incluyendo arrays) en inicializadores ctor? O el invalidness del código anterior es un corolario de algunas otras reglas?
  3. C ++ 0x inicializador listas de resolver el problema?

P.S. Por favor, no mencionar los vectores, boost :: matrices, y su superioridad con respecto a las matrices, que soy muy consciente de.

¿Fue útil?

Solución

  
      
  1. ¿Cómo puedo hacer lo que quiero hacer (es decir, inicializar una matriz en un constructor (no la asignación de elementos en el cuerpo)). ¿Es posible?
  2.   

Sí. Se trata de utilizar una estructura que contiene una matriz. Usted dice que ya sabe acerca de eso, pero entonces no entiendo la pregunta. De esa manera, no inicializar una matriz en el constructor, sin asignaciones en el cuerpo. Esto es lo que hace boost::array.

  

¿El C ++ 03 estándar digamos nada especial sobre la inicialización de agregados (incluyendo arrays) en inicializadores ctor? O el invalidness del código anterior es un corolario de algunas otras reglas?

A mem-inicializador usos inicialización directa. Y las reglas de la cláusula 8 prohíben este tipo de cosas. No estoy muy seguro sobre el siguiente caso, pero algunos compiladores no lo permito.

struct A {
  char foo[6];
  A():foo("hello") { } /* valid? */
};

GCC PR para más detalles.

  

Do C ++ 0x inicializador listas de resolver el problema?

Sí, lo hacen. Sin embargo, su sintaxis no es válida, creo. Usted tiene que utilizar llaves directamente al fuego fuera de la lista de inicialización

struct A {
  int foo[3];
  A():foo{1, 2, 3} { }
  A():foo({1, 2, 3}) { } /* invalid */
};

Otros consejos

C ++ 98 no proporciona una sintaxis directa para nada más que la reducción a cero (o para elementos no POD,-inicializar valor) de la matriz. Para que C(): arr() {} acaba de escribir.

Lo Roger Pate es equivocado acerca de las supuestas limitaciones de C ++ 0x agregada de inicialización, pero yo soy demasiado perezoso para mirar hacia arriba o comprobar que funciona, y no importa, ¿verdad? Editar : Roger estaba hablando de "C ++ 03", leí mal como "C ++ 0x". Lo sentimos, Roger. ?

A C ++ 98 Solución para su código actual es envolver la matriz en una struct e inicializar desde una constante estática de ese tipo. Los datos tienen que residir en algún lugar de todos modos. Fruto de la casualidad que puede tener este aspecto:

class C 
{
public:
    C() : arr( arrData ) {}

private:
     struct Arr{ int elem[3]; };
     Arr arr;
     static Arr const arrData;
};

C::Arr const C::arrData = {{1, 2, 3}};

Solución:

template<class T, size_t N>
struct simple_array { // like std::array in C++0x
   T arr[N];
};


class C : private simple_array<int, 3> 
{
      static simple_array<int, 3> myarr() {
           simple_array<int, 3> arr = {1,2,3};
           return arr;
      }
public:
      C() : simple_array<int, 3>(myarr()) {}
};
  1. No, por desgracia.
  2. Sólo puede no en la forma que desee, ya que no está permitido por la gramática (más abajo). Sólo se puede utilizar como ctor-inicialización y, como saben, que no está disponible para inicializar cada elemento de las matrices.
  3. Creo que sí, ya que generalizan inicialización en todos los ámbitos de muchas maneras útiles. Pero no estoy seguro de los detalles.

En C ++ 03, inicialización de agregados sólo se aplica con una sintaxis similar a la de abajo, que debe ser una declaración por separado y no encaja en un inicializador ctor.

T var = {...};

¿Qué tal

...
  C() : arr{ {1,2,3} }
{}
...

compila bien en g ++ 4.8

¿Quieres init una matriz de enteros en su constructor? Apuntar a una matriz estática.

class C 
{
public:
    int *cArray;

};

C::C {
    static int c_init[]{1,2,3};
    cArray = c_init;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top