2009-12-22 16 views
5

Me preguntaba, si un miembro de la matriz de una clase podría crearse inmediatamente después de la construcción de clase:C++ matriz Constructor

class C 
{ 
     public: 
      C(int a) : i(a) {} 

     private: 
      int i; 
}; 

class D 
{ 
public: 
     D() : a(5, 8) {} 
     D(int m, int n) : a(m,n) {} 

    private: 
    C a[2]; 

}; 

Por lo que Googled, creación de la matriz dentro de Constructor tales como anterior es en C++ imposible. Alternativamente, el miembro de la matriz se puede inicializar dentro del bloque Constructor de la siguiente manera.

class D 
    { 
    public: 
     D() { 
       a[0] = 5; 
       a[1] = 8; 
      } 
     D(int m, int n) { 
          a[0] = m; 
          a[1] = n; 
         } 
     private: 
     C a[2]; 

    }; 

Pero entonces, Ya no es una creación de matriz, sino una asignación de matriz. Los elementos de la matriz se crean automáticamente mediante el compilador a través de su constructor predeterminado y, posteriormente, se asignan manualmente a valores específicos dentro del bloque C'tor. Lo que es molesto para tal solución, la clase C tiene que ofrecer un Constructor predeterminado.

Alguien tiene alguna idea que me puede ayudar a crear miembros de la matriz en la construcción. Sé que usar std :: vector podría ser una solución pero, debido a las condiciones del proyecto, no tengo permitido usar ninguna biblioteca estándar, Boost o de terceros.

+1

Tienes que esperar por C++ 0x, lo que permite esta. –

Respuesta

5

Arrays - un concepto más antiguo que C++ en sí, heredado directamente de C - realmente no tienen constructores utilizables, como se está notando básicamente. Hay algunas soluciones que le quedan debido a las restricciones extrañas que está mencionando (¿ninguna biblioteca estándar?!?!?) - podría tener a ser un puntero a C en lugar de una matriz de C, asignar memoria sin formato para ello, inicialice cada miembro con "ubicación nueva" (eso funciona alrededor del problema de que C no tiene un constructor predeterminado, al menos).

+1

Las matrices C a menudo son superiores al vector cuando el tamaño es fijo; Los vectores C++ tampoco tienen la función "construir a partir de datos en línea" (aunque C++ 0x sí lo hace, como se mencionó, y usted puede declarar un conjunto constante e inicializar desde los iteradores). – Potatoswatter

1

Puede crear una clase para envolver una matriz y construirla como desee. Aquí hay un comienzo; este código no ha sido probado aparte de lo que ves.

#include <iostream> 
using namespace std; 

template< class T, int N > 
struct constructed_array { 
     char storage[ sizeof(T[N]) ]; // careful about alignment 
     template< class I > 
     constructed_array(I first) { 
       for (int i = 0; i < N; ++ i, ++ first) { 
         new(&get()[i]) T(*first); 
       } 
     } 
     T *get() const { return reinterpret_cast< T const* >(storage); } 
     T *get() { return reinterpret_cast< T * >(storage); } 
     operator T *() const { return get(); } 
     operator T *() { return get(); } 
}; 

char const *message[] = { "hello", ", ", "world!" }; 

int main(int argc, char ** argv) { 
     constructed_array< string, 3 > a(message); 
     for (int i = 0; i < 3; ++ i) { 
       cerr << a[i]; 
     } 
     cerr << endl; 
     return 0; 
} 
+0

Solo digo: boost :: array http://www.boost.org/doc/libs/1_41_0/doc/html/boost/array.html – sbk

+0

Estoy completamente de acuerdo. – Potatoswatter