Klassenobjekte.



  • Also d.h. dass die Klasse B sein Konstruktor zum schluss aufruft. Woher weisst der Compiler das? Egal auf jeden ist das so oder?

    Und noch was: Was ist ein statisches Element.



  • Und noch was: Was ist ein statisches Element.
    

    Ein statisches Element existiert nur einmal pro Klasse, ist also klassenspezifisch, und nicht wie normale Instanzvariablen der Klasse instanzspezifisch. D.h. alle Instanzen der Klasse teilen sich ein und dasselbe Element.



  • #include <iostream>
    using namespace std;
    
    class C
    { 
    	public:
    		C() { cout << "C::Standardkonstruktor" << endl; }
    		~C() { cout << "C::Destruktor" << endl; }
    };
    
    class A
    { 
    	public:
    		A() { cout << "A::Standardkonstruktor" << endl; }
    		~A() { cout << "A::Destruktor" << endl; }
    };
    
    class B : public A
    { 
    	public:
    		B(): A(){ cout << "B::Standardkonstruktor" << endl; }
    		~B() { cout << "B::Destruktor" << endl; }
    	private:
    	static C c_obj2;  //<<<<<================<<<<<============
    };
    
    void main(void)
    { 
    	cout << endl;
    	cout << "Start main()" << endl;
    	//A a_obj;
    	{B b_obj;}
    	//C c_obj; 
    	cout << "Ende main()" << endl;
    }
    

    <<<<========<<<<===== Also wenn ich C c_obj2; als statisches Element deklariere
    wird der Konstruktor von C nicht mehr aufgerufen. Warum?



  • Du hast c_obj2 gar nicht definiert. Würdest du darauf zugreifen, würde sich der Linker beschweren.

    In deinem Code fehlt

    C B::c_obj2;
    


  • Delikanli schrieb:

    <<<<========<<<<===== Also wenn ich C c_obj2; als statisches Element deklariere
    wird der Konstruktor von C nicht mehr aufgerufen. Warum?

    Das kommt daher weil du B::c_obj2 nur declariert aber nicht implementiert hast. Wenn du B::c_obj2 irgendwo verwenden würdest gäbe es einen Linker-Fehler.
    Richtig wäre

    C B::c_obj2;  // implementieren
    
    int main(void)
    {
        cout << endl;
        cout << "Start main()" << endl;
        //A a_obj;
        {B b_obj;}
        //C c_obj;
        cout << "Ende main()" << endl;
    }
    

    BTW: umbedingt lesen ( bald weigere ich mich solchen code auszuprobieren )
    http://www.research.att.com/~bs/bs_faq2.html#void-main

    EDIT: scheinbar schlafe ich noch



  • Aber auf der Seite 1 wurde es mir so gezeigt!?



  • Also ich muss C B::c_obj2; einfügen weil C c_obj2; ein statisches Element wurde oder wie sieht es jetzt aus. Ich bin ganz durcheinander jetzt und verstehe gar nichts mehr.



  • Delikanli schrieb:

    Also ich muss C B::c_obj2; einfügen weil C c_obj2; ein statisches Element wurde oder wie sieht es jetzt aus.

    So ist es. Wenn in einer Klassendeklaration ein statisches Element steht, ist das erst mal nur eine Deklaration. Das Element muss auch noch irgendwo definiert werden.



  • Delikanli schrieb:

    Aber auf der Seite 1 wurde es mir so gezeigt!?

    Wenn du damit das void main() meinst. Das zeigt dir hier keiner. 😉



  • Nein meine ich nicht. ich meine dass C c_obj2; ohne Definition!



  • Da wars nicht statisch.



  • Wieso kann ich den auf die Klasse C in der Klasse B zugreifen obwohl keine Vererbung besteht. Und das statische Element in unserem Fall habe ich immer noch nicht verstanden.



  • Delikanli schrieb:

    Wieso kann ich den auf die Klasse C in der Klasse B zugreifen obwohl keine Vererbung besteht.

    Wie kommst du darauf, dass dazu Vererbung notwendig wäre? Auf public-Elemente kann von überall zugegriffen werden.

    Und das statische Element in unserem Fall habe ich immer noch nicht verstanden.

    Was genau hast du nicht verstanden?



  • Und noch was. Wenn ich die Definition vor main einfüge bekomme ich bei so eine Ausgabe:
    C::Standardkonstruktor

    Start main()
    A::Standardkonstruktor
    B::Standardkonstruktor
    B::Destruktor
    A::Destruktor
    Ende main()
    Press any key to continue

    Der Destruktor von C taucht nicht auf.



  • Statische Element: Man kann dieses Element in Main nicht mehr verändern. Oder?
    Nur Außerhalb von main kann man ein statisches Element einer Klasse verändern.
    Ich verstehe den Sinn nicht so ganz, warum mann statische Elemente verwendet. Gibt es auch statische Elemente im main?





  • Delikanli schrieb:

    Statische Element: Man kann dieses Element in Main nicht mehr verändern. Oder?

    Nein. "Statisch" bezieht sich auf die Lebensdauer, nicht auf die Veränderbarkeit. Für letzeres gibt es const.

    Nur Außerhalb von main kann man ein statisches Element einer Klasse verändern.

    Nein. Siehe oben.

    Ansonsten kann ich GPC nur zustimmen. Alle deine Fragen werden in einem Tutorial beantwortet.



  • Ok ich habe jetzt alles durchgelesen über static und virtual und habe es verstanden jetzt.
    Muss ich den bei der Definition von C B::obj2; noch etwas ändern oder hinzufügen damit der Destruktor von C auch aufgerufen wird. Als Ausgabe bekomme ich:

    C::Standardkonstruktor 
    
    Start main() 
    A::Standardkonstruktor 
    B::Standardkonstruktor 
    B::Destruktor 
    A::Destruktor 
    Ende main() 
    Press any key to continue
    


  • Würde mir da keine besonderen Gedanken drüber machen. Wahrscheinlich gibts cout nicht mehr wenn dein ~C() aufgerufen wird.
    BTW bei mir ists denau umgekehrt ( g++ 3.3.5 ) ich sehe den Konstruktor- aufruf nicht.
    Sehe beide wenn ich B::c_obj2 initialisiere

    C B::c_obj2 = C();
    

    Kurt


Anmelden zum Antworten