lenguaje funciones estructuras estructura entre ejercicios ejemplo diferencia dev con anidadas c++ constructor struct const constants

c++ - entre - funciones con estructuras en c



C++ Inicialización de miembro de estructura constante (3)

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

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

En versiones anteriores del lenguaje, necesitaría una función de fábrica:

Foo() : bar(make_bar()) {} static timespec make_bar() {timespec bar = {1,1}; return bar;}

Tengo un miembro constant struct timespec en mi clase. ¿Cómo se supone que debo inicializarlo?

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

¡Muchas gracias!

#include <iostream> class Foo { private: const timespec bar; public: Foo ( void ) : bar ( 1 , 1 ) { } }; int main() { Foo foo; return 0; }

Compilación finalizada con errores: source.cpp: en el constructor ''Foo :: Foo ()'': source.cpp: 9: 36: error: no hay función de coincidencia para llamar a ''timespec :: timespec (int, int)'' source.cpp : 9: 36: nota: los candidatos son: En el archivo incluido desde sched.h: 34: 0, desde pthread.h: 25, desde /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/. ./../../../include/c++/4.7.2/i686-pc-linux-gnu/bits/gthr-default.h:41, de / usr / lib / gcc / i686-pc-linux -gnu / 4.7.2 /../../../../ include / c ++ / 4.7.2 / i686-pc-linux-gnu / bits / gthr.h: 150, de / usr / lib / gcc /i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:34, de / usr / lib / gcc / i686 -pc-linux-gnu / 4.7.2 /../../../../ include / c ++ / 4.7.2 / bits / ios_base.h: 41, de / usr / lib / gcc / i686-pc -linux-gnu / 4.7.2 /../../../../ include / c ++ / 4.7.2 / ios: 43, de /usr/lib/gcc/i686-pc-linux-gnu/4.7 .2 /../../../../ include / c ++ / 4.7.2 / ostream: 40, de /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../ ../../../include/c++/4.7.2/iostream:40, de source.cpp: 1: time.h: 120: 8: note: timespec :: timespec () time.h: 120: 8: nota: candidato espera 0 argumentos, 2 proporcionado time.h: 120: 8: nota: constexpr timespec :: timespec (const timespec &) time.h: 120: 8: nota: el candidato espera 1 argumento, 2 siempre time.h: 120: 8: nota: constexpr timespec :: timespec (timespec &&) time.h: 120: 8: nota: el candidato espera 1 argumento, 2 proporcionado


Use la lista de inicialización

class Foo { private: const timespec bar; public: Foo ( void ) : bar(100) { } };

Si quieres inicializar la estructura con brazales, úsalas

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


Use una lista de inicialización con una función auxiliar:

#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; }