2012-07-20 11 views
5

Das ist mein Beispielcode:Aufruf des Konstruktors einer anderen Klasse über die Initialisierungsliste. Haben Sie Probleme

#include <iostream> 
using namespace std; 

class Base 
{ 
public: 
    Base (int v, char z) {x=v;y=z;}; 
    int x; 
    char y; 
}; 

class Bar 
{ 
public: 
    Bar(int m, char n):q(m),s(n),base(q,s){}; 
    Base base; 
    int q; 
    char s;  
}; 

int main() 
{ 
    Bar barObj(5,'h');  
    cout << barObj.base.x << barObj.base.y << endl;  
    return 0; 
} 

Warum bin ich eine Leistung von 0 bekommen? http://ideone.com/pf47j

Auch im Allgemeinen, was ist die richtige Methode ein Element Objekt in einer anderen Klasse zu erstellen und den Konstruktor des Objekts aufrufen, wie oben mit Objektbasis class Base, innerhalb class Bar getan wurde?

+0

'Basisbasis;' nicht 'Basisbasis (int v, char z);'. Lesen Sie ein richtiges Buch. –

+0

Der Code in Ihrem Link ist anders als der Code, den Sie oben haben – mathematician1975

+0

Zusätzlich zu dem, was Cat Plus Plus sagte, müssen Sie 'm' und' n' verwenden. 'q' und' s' wurden nicht initialisiert, bevor "Base" konstruiert wurde. – IronMensan

Antwort

6

Die Initialisierungsreihenfolge der Datenelemente folgt ihrer Deklarationsreihenfolge, nicht der Reihenfolge, in der ihr Initialisierer aufgelistet ist. Daher wird Bar::base immer vor Bar::q und Bar::s initialisiert.
Wie in http://ideone.com/M6iKR, für Bar::Bar(int m, char n), initialisieren base mit m und n funktioniert gut.

+1

haben, wenn Sie' m verwenden, n 'statt' q, s' ist die Reihenfolge egal. –

+0

Danke Ich habe gerade die Deklaration von Bar :: Base unter q und s verschoben. – user1084113

Verwandte Themen