2012-09-28 187 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 - 好想法。如果我一直在想它,我會把它變成一個私人成員函數。只有在初始化通常與類功能無關的情況下,我纔會使它成爲「靜態」免費函數。 –