C++常量结构成员初始化
C++ Constant structure member initialization
我的类中有一个常量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})
- 为什么在C++中首先初始化成员类
- 是否可以防止省略聚合初始化成员?
- 正在复制具有未初始化成员的结构
- 使用大括号或括号初始化成员变量
- C++结构:强制初始化成员?
- C++中未初始化成员布尔变量的默认值是多少?
- 使用默认值初始化成员引用
- 在构造函数中初始化成员时,是否应该在成员上使用 std::move?
- C++使用 { } 初始化成员变量
- 如何根据构造函数参数使用超类类型初始化成员变量?
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 有没有办法在Brace中初始化成员
- 从现有 istream 或类本身创建的 istream 初始化成员 istream
- 从其后声明的另一个成员数据初始化成员数据是否为未定义行为
- 通常应用方法,使用带有构造函数委托的 SFINAE 通过类模板的构造函数初始化成员
- 如何在嵌套类中初始化成员?C
- 是否可以在构造函数主体中初始化成员变量,而不是初始值设定项列表
- 编译器错误,因为构造函数必须显式初始化成员
- 如何使用成员函数初始化成员函数指针
- C 如何使用隐藏的默认构造函数初始化成员