2010-12-03 5 views
10

Dies ist wahrscheinlich eine lächerlich einfache Frage, aber ich habe für die Antwort für eine Weile gesucht, aber kann nicht scheinen, dies herauszufinden. Ich versuche, eine konstante variable Konstante in einer Klasse zu initialisieren. Hier ist die Header-Datei:Nicht initialisierte konstante Mitglieder in Klassen

class Scheduler{ 
    public: 
    Scheduler(); 
    explicit Scheduler(unsigned long *); 

    private: 
    const unsigned long *const thresh; 

}; 

Und hier ist der Konstruktor für die Klasse

Scheduler::Scheduler(unsigned long * threshold): 
    thresh(threshold) 
{} 

Wenn ich versuche, diesen Code zu kompilieren ich in diesen Fehler laufen:

scheduler.cpp: In constructor ‘Scheduler::Scheduler()’: 
scheduler.cpp:3: error: uninitialized member ‘Scheduler::thresh’ with ‘const’ type ‘const long unsigned int* const’ 

Mehrere Quellen Das Online-Erörtern konstanter Membervariablen in Konstruktoren für Elementvariablen verweist auf die Verwendung von Initialisierungslisten. Ich denke, ich mache, was ich soll, aber anscheinend ist es immer noch nicht gut. Kann jemand sehen, was falsch ist?

+0

Ihr Code scheint die Implementierung des Standardkonstruktors zu fehlen, von wo der Fehler kommt. – visitor

Antwort

14

Sie müssen Ihr Konstantenelement in der Initialisierungsliste von ALL Konstruktoren initialisieren. Sie tun es nur für den mit einem Argument. Tun Sie es auch für den Standard, und alles wird gut. In diesem speziellen Fall initialisiere deinen Thresh mit 0 oder deaktiviere den Standardkonstruktor.

+0

das ist genau das, was ich brauchte. Vielen Dank! –

6

Das Problem in dem Default-Konstruktor, sollte es

Scheduler::Scheduler() : thresh(0) {} 

oder gar nicht umgesetzt werden, sein.

0

Ihr Code funktioniert für mich (MSVC2010) - wie ich glaube es sollte. Mit welchem ​​Compiler versuchst du das?
Die einzige Beschwerde, die ein Compiler mit dem Code haben könnte/sollte, ist eine Warnung, dass der automatische Kopierkonstruktor und der Zuweisungsoperator aufgrund des const-Members nicht erstellt werden können.

+0

Ich denke, Sie beziehen sich auf "albern-Warnungen" von VC++. Es macht nicht besonders viel Sinn, über diese Dinge zu warnen. – visitor

+0

Deine Laufleistung kann natürlich variieren ;-) Trotzdem habe ich in meiner Antwort den Default-Ctor vermisst - die anderen Poster stimmen darin, dass auch das const-Member initialisiert werden muss. – BuschnicK

+0

Wie kann ich die Warnung beheben? Ich erben von 'boost :: noncopyable ', um anzuzeigen, dass die Klasse nicht kopierbar/zuweisbar sein soll ... Zwei neue Warnungen: Jetzt kann auch kein impliziter Kopierkonstruktor erstellt werden! D'oh. – UncleBens

Verwandte Themen