2012-09-28 12 views
9

Mam stałą członka struct timespec w mojej klasie. Jak mam go zainicjować?C++ Stała inicjalizacja członka struktury

Jedyny szalony pomysł, jaki mam, to wyprowadzenie własnego timespec i nadanie mu konstruktora.

Wielkie dzięki!

#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

masz próbowałeś go zainicjować? –

+0

Jasne, zrobiłem. I mam błąd. Edytował pytanie. – Kolyunya

+0

Nie wiem, chłopaki, dlaczego mnie głosujesz, ale po prostu nie mogłem znaleźć poprawnej składni ... – Kolyunya

Odpowiedz

11

w C++ 11, można initalise łączny element na liście initialiser konstruktora:

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

w starszych wersjach języka, musisz funkcję fabryczną:

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

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

Mike, czy mógłbyś mi powiedzieć lub rzucić dobry link o tym, jak używać tej składni. Ponieważ 'bar {1,1} {}', 'bar {1,1}' i 'bar {1,1}) działają poprawnie. Jaka jest prawidłowa składnia? – Kolyunya

+2

@Kolyunya: 'bar {1,1}' i 'bar ({1,1})' są poprawne; pierwsza określa inicjowanie listy, a druga określa bezpośrednią inicjalizację z listy inicjalizacyjnej, która robi to samo. Używałbym tego pierwszego, ponieważ jest mniej skąpy i mówi jaśniej, co chcę zrobić. –

+0

Wielkie dzięki, Mike. – Kolyunya

3

lista Wykorzystanie inicjalizacji

class Foo 
{ 
    private: 
     const timespec bar; 

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

     } 
}; 

Jeśli chcesz zainicjować strukturę z bransolet następnie wykorzystać je

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

Mate, 'bar 'jest strukturą ... – Kolyunya

+0

Warto zauważyć, że inicjator nawiasów klamrowych jest funkcją C++ 11. –

4

użyć listy inicjalizacji z funkcji pomocnika:

#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

Uczyniłbym tę funkcję "statyczną" (wewnętrzne powiązanie) lub nawet lambdę w C++ 11, aby uniknąć zanieczyszczania interfejsu klasy. –

+0

@ DavidRodríguez-dribeas - Dobra myśl. Gdybym o tym pomyślał, zrobiłbym funkcję prywatną. Zrobiłbym tę funkcję "statyczną" tylko wtedy, gdy inicjalizacja nie jest ogólnie związana z funkcjonalnością klasy. –

Powiązane problemy