Programm mt zeigern, Vererbung etc.



  • Halöle.

    #include <iostream>
    
    class base
    {
    protected:
        const int m_anims;
        int*      m_a;
        base(int* a, int anims) : m_anims(anims) {m_a = new int[anims]; m_a = a;}
        void destroy() {delete[] m_a;}
    };
    
    class derived : public base
    {
    public:
        derived(int* a) : base(a, 10) {};
    
        void show()
        {
            for(int i = 0; i < m_anims; ++i)
            {
                std::cout << m_a[i] << '\n';
            }
        }
        ~derived() {destroy(); std::cout << "hallo";}
    }; 
    
    int main()
    {
        int a[10];
        for(int i = 0; i < 10; ++i)
            a[i] = 20 - i;
    
        derived* d;
        d = new derived(a);
        d->show();
        delete d;
    
        getchar();
    
        return 0;
    }
    

    Ich raffs nicht, der Code funktioniert nichtr, nachdem er wie befophlen die zahlen ausgegeben hat, bricht er zusammen.
    Das hängt mit delete[] zusammen, aber m_a != 0(=NULL)

    MfG MAV

    [ Dieser Beitrag wurde am 04.05.2003 um 21:21 Uhr von Mis2com editiert. ]



  • Versuche mal statt 0 NULL zu schreiben, die beiden ausdrücke sind nicht das selbe

    NULL : Meint "nichts", an der Speicherstelle befindet sich garnix
    0 : Meint den Wert 0, das Objekt an der Speicherstelle wird mit 0 initialisiert



  • Erst machst du int a[10]; dann a = new int[10]; und dann delete[] a.
    So kann das nicht funktionieren.

    @Parapiler
    Nein, das ist unfug. Soweit ich mich an die unzähligen Diskussionen hier im Forum erinnere, schreibt man in C++ einfach 0. Naja egal, tut hier jedenfalls absolut nix zur Sache.

    /* 1000! 🙂 */

    [ Dieser Beitrag wurde am 04.05.2003 um 21:38 Uhr von DrGreenthumb editiert. ]



  • eine Effizientere Routine für eine n Destruktor wäre übrigens diese hier:

    class CBase
    {
    
    public:
         int i;
        ~CBase ()
    { 
    
    if (i != NULL)
    {
    delete [] i;   
    i = NULL;
    }
    };*base
    


  • bist dir da sicher? *grummel* dann kapier ich nicht warum es die NULL- Konstante gibt.



  • Ich habe nochmal nachgelesen: wenn ein Zeiger den Wert NULL enthällt, dann weisst er auf keine gültige Adresse. Instanzen und Strukturen können mit 0 initalisiert werden, man denke nur an die initialisierung mit memset, zeiger selbst aber nicht. Ob das mit seinem Problem zusammenhängt muss er selbst mal testen einfach mal kurz ändern



  • also die NULL konstante gibts weil sie nicht immer 0 sein musste, z.b. könnte man sich ein prozessor ausdenken der ein vergleich auf 42 schneller kann als ander zahlen,
    unter c++ hat man sich gedacht, schreiben sowieso so viele stat NULL eine normale 0 im zeiger kontex also sagen wir das NULL immer 0 sein muss (unter c++)

    der erfinder von c++ sagt das man statt NULL lieber 0 benutzen soll, naja ich benutze aber leiber NULL im zeiger kontex da man dann später schnell den kontex erkennen kann



  • Wie gesagt, damit hängt es ganz sicher nicht zusammen.
    Ich hab mich für die NULL vs. 0 Geschichte nicht weiter interessiert, von daher kann ich nur auf die Suchfunktion des Forums verweisen.

    Das Problem ist so:

    m_a = new int[anims]; m_a = a; // eh totaler Blödsinn
    delete[] m_a;

    Das Array auf dem Stack darf man nicht mit new löschen.



  • Original erstellt von Dimah:
    also die NULL konstante gibts weil sie nicht immer 0 sein musste, z.b. könnte man sich ein prozessor ausdenken der ein vergleich auf 42 schneller kann als ander zahlen,
    unter c++ hat man sich gedacht, schreiben sowieso so viele stat NULL eine normale 0 im zeiger kontex also sagen wir das NULL immer 0 sein muss (unter c++)

    Das ist bestenfalls misverständlich. NULL ist ein Makro, dass zu einem integralen Ausdruck mit dem Wert 0, einer sogennanten Nullzeigerkonstante, expandiert, die bei der Zuweisung an einen Zeiger p, jenen in einen Nullzeiger verwandelt. Also muss NULL zu 0 werden, wenigstens in C++. Für C gilt prinzipiell das gleiche wie für C++, nur dass aufgrund eines extra eingefügten Typenlochs (der einzige Untwerschied, wieso C++ ach so viel strenger als C getypt ist, übrigens) auch etwa '(void*)0' sein kann. Damit kann man 'int i = NULL;' in C++ immer schreiben, in C nicht.

    Desweiteren if ein 'if(p) delete[]p;' überflüssig. 'delete' prüft selbständig, ob p ein Nullzeiger ist.



  • das mit der (void*)42 habe ich hier irgend wo her, aber das mit den typen loch wird mir jetzt klar
    danke



  • Zuerst mal, danke für die vielen Antworten.
    Ich schreibe 0 statt NULL, und Bjarne Stroustrup findet das auch besser und der sollte es wisen. 😉 (oder nicht? :D)

    Hallo (!)

    @DrGreenThumb:
    Argh stimmt, Anfängerfehler. 😞
    Jut, äh, also ist memcpy besser oder eine Schleife drüber?

    MfG MAV

    [ Dieser Beitrag wurde nicht am 05.05.2003 um 19:42 Uhr von Mis2com editiert. ]

    [ Dieser Beitrag wurde am 05.05.2003 um 20:33 Uhr von Mis2com editiert. ]



  • Also was ist besser?



  • memcpy



  • Aha, gut zu wissen.

    Bestätigung oder Widerspruch? ^^

    Ich nehm's jedenfalls erstmal...

    [EDIT]

    memcpy(m_a, a, sizeof(int)*anims);
    

    Das funktioniert, aber sizeof(a) oder sizeof(m_a) funktioniert nicht, gehts nicht leichter? 😕

    MfG Mis2com

    [ Dieser Beitrag wurde am 06.05.2003 um 16:26 Uhr von Mis2com editiert. ]



  • nein.



  • OK; wollt nur wissen, ob das so auch i.O. ist, mit deiner Zustimmung kann ich es nun gewissenhaft einsetzen, danke. 😃

    Suizi' MAV


Anmelden zum Antworten