2012-09-28 22 views
9

Ich habe eine Konstante struct timespec Mitglied in meiner Klasse. Wie soll ich es initialisieren?C++ Konstante Struktur Mitglied Initialisierung

Die einzige verrückte Idee, die ich bekommen habe, ist, meinen eigenen timespec abzuleiten und ihm einen Konstruktor zu geben.

Vielen Dank!

#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

Haben Sie versucht, es gerade zu initialisieren? –

+0

Sicher, ich tat es. Und ich habe einen Fehler bekommen. Bearbeitete die Frage. – Kolyunya

+0

Ich weiß nicht, Jungs, warum Sie mich unten abstimmen, aber ich konnte einfach nicht die richtige Syntax finden ... – Kolyunya

Antwort

11

In C++ 11, können Sie ein Aggregat Mitglied im Konstruktor des initialiser Liste initalise:

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

In älteren Versionen der Sprache, würden Sie eine Fabrik-Funktion benötigen:

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

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

Mike, könnten Sie mir bitte sagen oder einen guten Link darüber werfen, wie ich diese Syntax verwende. Da 'bar {1,1} {}', 'bar {1,1}' und 'bar ({1,1})' richtig funktionieren. Was ist die korrekte Syntax? – Kolyunya

+2

@Kolyunya: 'bar {1,1}' und 'bar ({1,1})' sind beide korrekt; der erste gibt die Initialisierung der Liste an, während der zweite die Direktinitialisierung aus einer Initialisiererliste spezifiziert, die das Gleiche tut. Ich würde das erste verwenden, weil es weniger schnörkellos ist und klarer sagt, was ich tun möchte. –

+0

Vielen Dank, Mike. – Kolyunya

3

Verwenden Initialisierungsliste

class Foo 
{ 
    private: 
     const timespec bar; 

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

     } 
}; 

Wenn Sie mit Stärkungsmitteln initialisieren Struktur wollen, dass sie dann

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

Mate, 'bar 'ist eine Struktur ... – Kolyunya

+0

Es kann erwähnenswert sein, dass der Klammerinitialisierer eine C++ 11-Funktion ist. –

4

Verwenden eine Initialisierung verwenden Liste mit einer Hilfsfunktion:

#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

Ich würde das eine "statische" (interne Verknüpfung) Funktion oder sogar ein Lambda in C++ 11 machen, um eine Verschmutzung der Klassenschnittstelle zu vermeiden. –

+0

@ DavidRodríguez-dribeas - Guter Gedanke. Ich hätte es zu einer privaten Mitgliederfunktion gemacht, wenn ich darüber nachgedacht hätte. Ich würde es nur dann zu einer "statischen" freien Funktion machen, wenn die Initialisierung im Allgemeinen nichts mit der Klassenfunktionalität zu tun hat. –

Verwandte Themen