C++常量结构成员初始化

C++ Constant structure member initialization

本文关键字:初始化 成员 结构 常量 C++      更新时间:2023-10-16

我的类中有一个常量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,来自源。cpp:1:时间。h:120:8:note:timespec::timespec()时间。h:120:8:note:candidate需要0arguments,2提供时间。h:120:8:注释:constexprtimespec::timespec(const timespec&)时间。h:120:8:注意:候选需要1个参数,提供2个时间。h:120:8:注意:constexprtimespec::timespec(timespec&&)时间。h:120:8:注意:候选者需要1个自变量,2个提供

在C++11中,您可以在构造函数的初始化器列表中初始化聚合成员:

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

在该语言的旧版本中,您需要一个工厂函数:

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

使用带有辅助函数的初始化列表:

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

使用初始化列表

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

如果你想用bracers初始化结构,那么就用它们

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