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