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

时间:2012-09-28 13:54:15

标签: c++ constructor struct const constants

我班上有一名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提供

3 个答案:

答案 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})