2017-10-29 3 views
0

Ich versuche, eine Basisklasse Mitglied Element über eine abgeleitete Klasse zu initialisieren. Das Problem, das ich habe, ist, dass der Wert, den ich überlasse, von "x" abhängt. also hier ist, was ich tue.?Wie initiiere ich einen Basiskonstruktor in geschweiften Klammern des abgeleiteten Konstruktors? C++

Derived:: Derived() 
{ 
    uint8 number = getNumber(); 
    P p; 

    if (number == 3) 
    { 
     p = P1; 
    } 
    else 
    { 
    p = P2; 
    } 

    Base(p); 
} 

ich den Fehler „kein Standard-Konstruktor für Klasse vorhanden ist‚Base‘bekommen Was mache ich falsch

+0

Haben Sie die Konstruktor Basis definieren :: Base (P p) in der Basisklasse – HJuls2

+0

@ HJuls2 - Es ist definiert, aber es gibt kein 'Base()', wie t Der Fehler zeigt an. 'Base (p);' ist kein Call. Es definiert ein Objekt mit dem Namen "p" vom Typ "Base" und versucht, es standardmäßig zu konstruieren. – StoryTeller

+0

Base (p) ist der Aufruf des Konstruktors. Base :: Base (Pp); –

Antwort

3

Sie nur eine Basisklasse in der initialisieren Mitglied Initialisiererliste Sequenz eines Konstruktor Wenn das einen anderen Code erfordert aufrufe, können Sie delegieren, dass an eine Hilfsfunktion.?

P calculate_p() { 
    uint8 number = getNumber(); 
    if (number == 3) 
    return P1; 

    return P2; 
} 

Derived::Derived() : Base(calculate_p()) 
{ 
} 
+0

und calculate_p ist nicht Teil der Klasse D? –

+0

@NoaRegev - Ihr Codebeispiel zeigt nicht an, dass es sein muss. Es ist normalerweise am besten, mit möglichst lockerer Kopplung zu gehen. Wenn 'calculate_p' keinen Zugriff auf die Klasse erfordert, sollten Sie es besser als versteckte, nutzungsfreie Funktion verwenden. – StoryTeller

+0

das wird funktionieren. –

Verwandte Themen