2009-04-25 5 views
1

Ich habe eine sehr frustrierende Zeit mit einer geerbten Klasse, die einen expliziten Konstruktor der Superklasse aufruft. Ich kann einfach nicht die Syntax richtig bekommen!C++ Explicit Superclass Constructor Problem bei der Verwendung von Header-Dateien

Alle Beispiele, die ich bisher gesehen habe, trennen die Header- und Inline-Klassendefinition (mit {} 's) nicht von Vorwärtsdeklarationen mit einer Header-Datei, also bin ich mir nicht sicher wie man die Syntax zwischen den .h- und .cc-Dateien abdeckt. Jede Hilfe wäre willkommen! Hier

ist der Fehler der Compiler gibt mir (gcc):

serverconnection.h: In constructor "ServerConnection::ServerConnection(std::string, std::string)": serverconnection.h:25: error: expected `{' at end of input serverconnection.cc: At global scope: serverconnection.cc:20: error: redefinition of "ServerConnection::ServerConnection(std::string, unsigned int, short unsigned int, PacketSender*, int)" serverconnection.h:25: error: "ServerConnection::ServerConnection(std::string, unsigned int, short unsigned int, PacketSender*, int)" previously defined here serverconnection.cc: In constructor "ServerConnection::ServerConnection(std::string, std::string)": serverconnection.cc:20: error: no matching function for call to "Connection::Connection()"

Ich verstehe, dass es versucht, den Standard-Verbindungs ​​Konstruktor, Anschluss() zu nennen, da es einfach nicht meine Syntax nicht versteht. Hier

ist der Code:

connection.h:

class Connection { 
    public: 
     Connection(string myOwnArg); 
}; 

connection.cc:

#include "connection.h" 
Connection::Connection(string myOwnArg) { 
    //do my constructor stuff 
} 

serverconnection.h:

#include "connection.h" 
class ServerConnection : public Connection { 
    public: 
     ServerConnection(string myOwnArg, string superClassArg) : Connection(superClassArg); 
}; 

serverconnection.cc:

#include "serverconnection.h" 
#include "connection.h" 
ServerConnection::ServerConnection(string myOwnArg, string superClassArg) { 
    //do my constructor stuff 
} 

Vielen Dank im Voraus!

Antwort

5

Sie setzen die Initialisiererliste nicht in die Klassendeklaration, sondern in die Definition der Funktion. Entfernen Sie es aus dem Kopf, und in der .cc-Datei:

#include "serverconnection.h" 
#include "connection.h" 

ServerConnection::ServerConnection(string myOwnArg, string superClassArg) : Connection(superClassArg) { 
    //do my constructor stuff 
} 
+0

Danke! Ich schätze, du schlägst Jeff um 13 Sekunden, also werde ich deine Antwort als akzeptiert markieren (sorry Jeff!) –

+0

Danke! Aus irgendeinem Grund zeigt die überwiegende Mehrheit der C++ - Tutorials nicht, wie die Dinge sind, wenn getrennte h-und cc-Dateien verwendet werden .... – jotadepicas

2

Sie müssen die Basisklasse Initialisiererliste von serverconnection.h zum Server connection.cc bewegen:

ServerConnection::ServerConnection(string myOwnArg, string superClassArg) 
    : Connection(superClassArg) { 
    //do my constructor stuff 
} 

Und erklären nur die ServerConneciton-Konstruktor ohne Dekoration in der Kopfzeile.

+0

Funktioniert jetzt perfekt! Vielen Dank für Ihre schnelle Antwort –

0

Sie verpassen das Semikolon am Ende der Klassendeklaration:

class Connection { 
    public: 
     Connection(string myOwnArg); 
}; // semicolon here 

Vergessens, die einige sehr verwirrend Fehlermeldungen führen kann, und der Compiler den Fehler in der Datei dort nicht setzen die Fehler ist wirklich.

Und wenn Sie eine Member-Initialisierungsliste in Ihrer Konstruktordeklaration/-definition angeben, müssen Sie die geschweiften Klammern für den Rest der Implementierung angeben, auch wenn Sie keinen Code in diese Klammern setzen. Stellen Sie sich die Mitgliederinitialisierungsliste als Teil der Definition vor, nicht als Teil der Deklaration.

+0

Tut mir leid, das war eigentlich ein Cut-and-Paste-Problem, da der eigentliche Code viel massiver ist. Aber gutes Auge! –