2016-06-26 7 views
1

Ich bin ein C++ Anfänger. Ich habe gelernt, wie abgeleitete Klasse Konstruktor als Klassenmitglied zu definieren:Wie definiere ich den Nicht-Member-Konstruktor einer abgeleiteten Klasse (innerhalb der Klassenkopfzeile)

class A{ 
    ... 
    public: 
    A(params){} 
}; 

class B :public A{ 
    ... 
    public: 
    B(param1OfA, param2OfA, params) :A(param1OfA, param2OfA){} 
}; 

Nun, dachte ich, das gleiche Prinzip für Dritt Definition der abgeleiteten Klasse Konstruktor arbeiten würde auch:

class A{ 
    ... 
    public: 
    A(params); 
} 

A::A(params){}; 

class B :public A{ 
    ... 
    public: 
    B(param1OfA, param2OfA, params) :A(param1OfA, param2OfA); 
}; 

B::B(param1OfA, param2OfA, params) :A(param1OfA, param2OfA){} 

sondern, erhalte ich diesen Fehler in Visual Studio:

1> Source.cpp 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(63): error C2969: syntax error : ';' : expected member function definition to end with '}' 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(67): error C2144: syntax error : 'std::string' should be preceded by ')' 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(67): error C2630: ';' found in what should be a comma-separated list 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(67): error C2612: trailing 'type' illegal in base/member initializer list 
1>d:\webdev\c++\godina ii - parcijala-i\aa-vjezba-polimorfizam\source.cpp(84): fatal error C1004: unexpected end-of-file found 
+0

Warum definieren Sie den Konstruktor zweimal? –

+0

@ πάνταῥεῖ Wenn Sie auf das zweite Beispiel (Nichtmitglied) und die Verwendung von geschweiften Klammern nach der Konstruktordeklaration im Abschnitt 'public' verweisen, waren das die Tippfehler beim Kopieren der ersten Beispiele. Ich habe diese entfernt. – developer10

Antwort

1

Sie nah sind. Um die Konstruktor-Bodendefinition (oder eine andere Klassen-Methodendefinition) außerhalb der Klassendeklaration zu verschieben, müssen Sie die Bodydefinition aus der Klassendeklaration entfernen. Sie haben das für A getan, Sie müssen es auch für B tun.

Auch Sie fehlen die schließenden ; auf die Klassenerklärungen.

class A 
{ 
    ... 
public: 
    A(params); 
}; 

A::A(params) 
{ 
} 

class B : public A 
{ 
    ... 
public: 
    B(param1OfA, param2OfA, params); 
}; 

B::B(param1OfA, param2OfA, params) 
    : A(param1OfA, param2OfA) 
{ 
} 
+0

Bitte beachten Sie meinen Kommentar direkt unter der Frage. Ich habe tatsächlich einen Tippfehler gemacht, d. vergessen, die geschweiften Klammern zu entfernen, wenn Sie den Code des ersten Beispiels kopieren. Also, was ich tatsächlich hatte, bevor ich diese Frage posten konnte, war fast genau das, was du geschrieben hast (ist diese Zeile deines Codes okay?) B (param1OfA, parm2OfA, params); '<- kein Doppelpunkt und Basisklasse in der Kopfzeile?) – developer10

+1

@ developer10 Wenn das, was in Ihrer Frage angezeigt wird, falsch ist, sollten Sie es bearbeiten, um anzuzeigen, was Sie tatsächlich verwenden. Was meine Antwort betrifft, was ich zeige, ist korrekt. –

1

Ein Mitglied Initialisiererliste nicht in einer reinen Erklärung angegeben werden kann,

B(param1OfA, param2OfA, params) :A(param1OfA, param2OfA); 

Sie sich, dass

B(param1OfA, param2OfA, params); 

Auch gibt bei der ein fehlendes Semikolon ist Ende dieser Klasse defini :

class A{ 
    ... 
    public: 
    A(params); 
} 
Verwandte Themen