2012-09-28 83 views
9

我的班上有一个常数struct timespec成员。我该如何初始化它?C++恒定结构成员初始化

我得到的唯一一个疯狂的想法是派生自己的timespec并给它一个构造函数。

非常感谢!

#include <iostream> 

class Foo 
{ 
    private: 
     const timespec bar; 

    public: 
     Foo (void) : bar (1 , 1) 
     { 

     } 
}; 


int main() { 
    Foo foo;  
    return 0; 
} 

Compilation finished with errors: 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: note: candidates are: In file included from sched.h:34:0, from pthread.h:25, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/i686-pc-linux-gnu/bits/gthr-default.h:41, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/i686-pc-linux-gnu/bits/gthr.h:150, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ext/atomicity.h:34, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/bits/ios_base.h:41, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ios:43, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/ostream:40, from /usr/lib/gcc/i686-pc-linux-gnu/4.7.2/../../../../include/c++/4.7.2/iostream:40, from source.cpp:1: time.h:120:8: note: timespec::timespec() time.h:120:8: note: candidate expects 0 arguments, 2 provided time.h:120:8: note: constexpr timespec::timespec(const timespec&) time.h:120:8: note: candidate expects 1 argument, 2 provided time.h:120:8: note: constexpr timespec::timespec(timespec&&) time.h:120:8: note: candidate expects 1 argument, 2 provided

+1

有你尝试只是初始化它? –

+0

当然,我做到了。我得到一个错误。编辑了这个问题。 – Kolyunya

+0

我不认识的人,为什么你给我投票,但我找不到正确的语法... – Kolyunya

回答

11

在C++ 11,你可以initalise在构造函数中的初始化器列表中的总成员:

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

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

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

static timespec make_bar() {timespec bar = {1,1}; return bar;} 
+0

迈克,你能告诉我或抛出一个关于如何使用这种语法的好链接。由于'bar {1,1} {}','bar {1,1}'和'bar({1,1})'正常工作。什么是正确的语法? – Kolyunya

+2

@Kolyunya:'bar {1,1}'和'bar({1,1})'都是正确的;第一个指定列表初始化,而第二个指定从初始化列表直接初始化,它执行相同的操作。我会使用第一个,因为它不那么曲折,并且更清楚地说明我想要做什么。 –

+0

非常感谢,迈克。 – Kolyunya

3

使用初始化列表

class Foo 
{ 
    private: 
     const timespec bar; 

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

     } 
}; 

如果你想与护腕初始化结构,然后用它们

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

Mate,'bar '是一个结构... – Kolyunya

+0

可能值得注意的是,大括号初始值设定项是一个C++ 11功能。 –

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; 
} 
+1

我会在C++ 11中创建一个'static'(内部链接)函数或一个lambda表达式来避免污染类接口。 –

+0

@DavidRodríguez-dribeas - 好想法。如果我一直在想它,我会把它变成一个私人成员函数。只有在初始化通常与类功能无关的情况下,我才会使它成为“静态”免费函数。 –