2016-07-06 18 views
0

Ich habe eine Anwendung mit Basis-und abgeleiteten Klasse. Ich muss ein Feld der Basisklasse in abgeleitetem haben, aber habe einige Probleme, es zu initialisieren. Hier ist der Code:keine passende Funktion für den Aufruf von 'X :: X()'

#include <iostream> 
using namespace std; 

class X 
{ 
public : 
    X(int x) { } 
} ; 

class Y : public X 
{ 
    X x ; 
    Y* y ; 
    Y(int a) : x(a) { } 
} ; 

int main() 
{ 
    return 0; 
} 

Und die Fehler:

/tmp/test.cpp||In constructor ‘Y::Y(int)’:| 
/tmp/test.cpp|14|error: no matching function for call to ‘X::X()’| 
/tmp/test.cpp|14|note: candidates are:| 
/tmp/test.cpp|7|note: X::X(int)| 
/tmp/test.cpp|7|note: candidate expects 1 argument, 0 provided| 
/tmp/test.cpp|4|note: X::X(const X&)| 
/tmp/test.cpp|4|note: candidate expects 1 argument, 0 provided| 
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===| 

Antwort

5

Der Grund für den Fehler ist, dass Sie nicht den X Teil von Y konstruieren. Da Y von X erbt, müssen Sie den X Teil von Y konstruieren. Da hast du nicht der Compiler für dich gemacht. Wenn es das tut, verwendet es den Standardkonstruktor, den X nicht hat, so erhalten Sie den Fehler. Sie müssen wie etwas haben

Y(int a) : X(some_value), x(a) { } 

Um den X Teil Y und das x Mitglied Y zu konstruieren. Oder Sie könnten einen Standardkonstruktor für X hinzufügen und ihn standardmäßig konstruieren lassen.

8

Sie müssen den Oberklassenkonstruktors nennen, weil ein Standardkonstruktor nicht verfügbar:

Y(int a) : X(some_int_like_maybe_a), x(a) { } 

Sehen Sie sich auch Kennzeichnung X::X(int) als explicit.