2012-09-28 6 views
9

Tengo un miembro constante struct timespec en mi clase. ¿Cómo se supone que debo inicializarlo?C++ Inicialización de miembro de estructura constante

La única idea loca que obtuve es derivar mi propio timespec y darle un constructor.

Gracias tanto!

#include <iostream> 

class Foo 
{ 
    private: 
     const timespec bar; 

    public: 
     Foo (void) : bar (1 , 1) 
     { 

     } 
}; 


int main() { 
    Foo foo;  
    return 0; 
} 

Compilation finished with errors: source.cpp: In constructor 'Foo::Foo()': source.cpp:9:36: error: no matching function for call to 'timespec::timespec(int, int)' source.cpp:9:36: note: candidates are: In file included from sched.h:34:0, from pthread.h:25, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/i686-pc-linux-gnu/bits/gthr-default.h:41, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/i686-pc-linux-gnu/bits/gthr.h:150, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:34, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/ios_base.h:41, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ios:43, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ostream:40, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:40, from source.cpp:1: time.h:120:8: note: timespec::timespec() time.h:120:8: note: candidate expects 0 arguments, 2 provided time.h:120:8: note: constexpr timespec::timespec(const timespec&) time.h:120:8: note: candidate expects 1 argument, 2 provided time.h:120:8: note: constexpr timespec::timespec(timespec&&) time.h:120:8: note: candidate expects 1 argument, 2 provided

+1

usted tiene ¿Intenté solo inicializarlo? –

+0

Claro, lo hice. Y recibí un error. Editado la pregunta. – Kolyunya

+0

No sé chicos, por qué me votan, pero no pude encontrar la sintaxis correcta ... – Kolyunya

Respuesta

11

En C++ 11, puede initalise un miembro de agregado en la lista de inicializador del constructor:

Foo() : bar{1,1} {} 

En las versiones anteriores de la lengua, se necesitaría una función de fábrica:

Foo() : bar(make_bar()) {} 

static timespec make_bar() {timespec bar = {1,1}; return bar;} 
+0

Mike, podría decirme o lanzar un buen enlace sobre cómo uso esta sintaxis. Como 'bar {1,1} {}', 'bar {1,1}' y 'barra ({1,1})' funcionan correctamente. ¿Cual es la sintaxis correcta? – Kolyunya

+2

@Kolyunya: 'bar {1,1}' y 'bar ({1,1})' son ambos correctos; el primero especifica la inicialización de la lista, mientras que el segundo especifica la inicialización directa desde una lista de inicializadores, que hace lo mismo. Usaría el primero porque es menos ondulado, y dice más claramente lo que quiero hacer. –

+0

Muchas gracias, Mike. – Kolyunya

3

lista Uso de inicialización

class Foo 
{ 
    private: 
     const timespec bar; 

    public: 
     Foo (void) : 
      bar(100) 
     { 

     } 
}; 

Si desea inicializar la estructura con brazales luego los utilizan

Foo (void) : bar({1, 2}) 
+0

Mate, 'bar 'es una estructura ... – Kolyunya

+0

Puede valer la pena señalar que el inicializador de llaves es una característica de C++ 11. –

4

utilizar una lista de inicialización con una función de ayuda:

#include <iostream> 
#include <time.h> 
#include <stdexcept> 

class Foo 
{ 
    private: 
     const timespec bar; 

    public: 
     Foo (void) : bar (build_a_timespec()) 
     { 

     } 
    timespec build_a_timespec() { 
     timespec t; 

     if(clock_gettime(CLOCK_REALTIME, &t)) { 
     throw std::runtime_error("clock_gettime"); 
     } 
     return t; 
    } 
}; 


int main() { 
    Foo foo;  
    return 0; 
} 
+1

Haría de eso una función 'estática' (enlace interno) o incluso una lambda en C++ 11 para evitar contaminar la interfaz de clase. –

+0

@ DavidRodríguez-dribeas - Buena idea. Hubiera convertido en una función de miembro privado si hubiera estado pensando en ello. Lo convertiría en una función libre de "estática" solo si la inicialización generalmente no está relacionada con la funcionalidad de la clase. –

Cuestiones relacionadas