11

我班里有固定的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: In constructor 'Foo::Foo()': source.cpp:9:36: error: no matching function for call to '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: note: timespec::timespec() time.h:120:8: note: 候选人期望 0 个参数,2 个提供 time.h:120:8: note : constexpr timespec::timespec(const timespec&) time.h:120:8: 注意:候选人需要 1 个参数,2 个提供 time.h:120:8: 注意: constexpr timespec::timespec(timespec&&) time.h:120 :8: 注意:候选人期望 1 个参数,提供 2 个参数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&) time.h:120:8: 注意: 候选人需要 1 个参数,提供 2 个 time.h:120:8: 注意: constexpr timespec::timespec(timespec&&) time.h:120:8:注意:候选人需要 1 个参数,提供 2 个参数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&) time.h:120:8: 注意: 候选人需要 1 个参数,提供 2 个 time.h:120:8: 注意: constexpr timespec::timespec(timespec&&) time.h:120:8:注意:候选人需要 1 个参数,提供 2 个参数提供 2 个提供 2 个

4

3 回答 3

13

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

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

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

Foo() : bar(make_bar()) {}

static timespec make_bar() {timespec bar = {1,1}; return bar;}
于 2012-09-28T14:11:43.337 回答
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;
}
于 2012-09-28T13:59:13.690 回答
3

使用初始化列表

class Foo
{
    private:
        const timespec bar;

    public:
        Foo ( void ) :
            bar(100)
        { 

        }
};

如果你想用括号初始化结构然后使用它们

Foo ( void ) : bar({1, 2})
于 2012-09-28T13:56:10.823 回答