2012-04-14 16 views
0

Hilfe! Ich bin neu in C++ ... Wie kann ich diese Header-Datei reparieren?C++ - Fehler: erwartet ein '{'

#pragma once 
class MyCls2 
{ 
private: 
    int _i, _j; 
public: 
    MyCls2(int i, int j) : _i(i), 
          _j(j) 
    MyCls2(); // error: expected a '{' 
    ~MyCls2(void); 
}; 

Dies ist der Fehler in MS VC 2010:

error: expected a '{'


Danke für die Hilfe, habe ich, was ich will jetzt:

.h:

#pragma once 
class MyCls2 
{ 
private: 
    int _i, _j; 
public: 
    MyCls2(int i, int j) ; 
    MyCls2(); 
    ~MyCls2(void); 
}; 

.cpp:

#include "StdAfx.h" 
#include "MyCls2.h" 


MyCls2::MyCls2() 
{ 
} 

MyCls2::MyCls2(int i, int j) : _i(i), 
    _j(j) 
{ 
} 
MyCls2::~MyCls2(void) 
{ 
} 

Antwort

5

Sie stellen die Konstruktordefinition mithilfe von Initialisierungslisten bereit. Also, es braucht eine {} wie jede andere (Mitglied) -Funktion.

MyCls2(int i, int j) : _i(i), 
         _j(j) {} // Missing the opening and closing braces 
2

Sie verpassen die Funktion Körper in Ihrer Definition des MyCls2 Konstruktor, der zwei Ints nimmt.

MyCls2(int i, int j) : _i(i), 
         _j(j) {} 

Denken Sie an die Initialisierungsliste als Teil des Konstruktors selbst (seine Definition, nicht seine Deklaration). Sie können keinen Teil der Definition einer Funktion irgendwo und einen anderen Teil anderswo haben.

Wenn Sie die Initialisierungsliste in der Kopfzeile möchten, benötigen Sie den Rest dieser Definition (den Konstruktor) auch in der Kopfzeile, wie oben.
Wenn Sie die Definition in der Kopfzeile nicht möchten, setzen Sie die Initialisierungsliste nicht in die Kopfzeile, sondern in die Implementierungsdatei.

//header 
    MyCls2(int i, int j); 
// implementation 

MyCls2::MyCls2(int i, int j) : _i(i), _j(j) 
{ 
    // constructor body 
} 
+0

schnell Erstaunlicher ... Dank ... aber es ist nur die Header-Datei, so dass ich davon ausgehen, es nicht eine Funktion Körper haben sollte? –

+3

Nein, Header-Dateien können einen Inlined-Funktionskörper haben, und Ihre Syntax ist eine implizit inline-Konstruktorfunktion. –

+2

@im_chc: Wenn Sie den Konstruktor nicht in der Kopfzeile definieren wollen, müssen Sie nur 'MyCls2 (int i, int j);'. Fügen Sie die Initialisierungsliste zusammen mit dem Rumpf des Konstruktors in die Implementierungsdatei ein (auch wenn sie leer ist). Aber es ist nichts falsch daran, den Konstruktor in der Kopfzeile zu haben, besonders wenn es sehr kurz ist. – Mat

1

MyCls2(int i, int j) : _i(i), 
         _j(j) 

mit

MyCls2(int i, int j) : _i(i), _j(j) { } 

ersetzen Der Konstruktor einen Körper braucht, auch wenn es eine leere ist.

1

Zahnspange für Konstruktor:

MyCls2(int i, int j) : _i(i), 
          _j(j) {}