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:コンストラクター内'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から、from 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 に答える