我班上有一名struct timespec
名成员。我该如何初始化呢?
我得到的唯一疯狂的想法是派生我自己的timespec
并给它一个构造函数。
非常感谢!
#include <iostream>
class Foo
{
private:
const timespec bar;
public:
Foo ( void ) : bar ( 1 , 1 )
{
}
};
int main() {
Foo foo;
return 0;
}
编译完成时出现错误:source.cpp:在构造函数中 'Foo :: Foo()':source.cpp:9:36:错误:没有匹配的函数用于调用 'timespec :: timespec(int,int)'source.cpp:9:36:注意:候选人是: 在sched.h中包含的文件中:34:0, 来自pthread.h:25, 来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/i686-pc-linux-gnu/bits/ gthr-default.h:41, 来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/i686-pc-linux-gnu/bits/ gthr.h:150, 来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:34, 来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/ios_base.h:41, 来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ios:43, 来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ostream:40, 来自/usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:40, 来自source.cpp:1:time.h:120:8:注意:timespec :: timespec()time.h:120:8:注意:候选人期望0 参数,2提供time.h:120:8:注意:constexpr timespec :: timespec(const timespec&amp;)time.h:120:8:注意:候选人 期望1个参数,2个提供time.h:120:8:注意:constexpr timespec :: timespec(timespec&amp;&amp;)time.h:120:8:注意:候选人期望 1个参数,2提供
答案 0 :(得分:11)
在C ++ 11中,您可以在构造函数初始化列表中初始化聚合成员:
Foo() : bar{1,1} {}
在该语言的旧版本中,您需要一个工厂函数:
Foo() : bar(make_bar()) {}
static timespec make_bar() {timespec bar = {1,1}; return bar;}
答案 1 :(得分:4)
使用带辅助函数的初始化列表:
#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;
}
答案 2 :(得分:3)
使用初始化列表
class Foo
{
private:
const timespec bar;
public:
Foo ( void ) :
bar(100)
{
}
};
如果你想用支撑物初始化结构,那就使用它们
Foo ( void ) : bar({1, 2})