Variablenzugriff bei Vererbung



  • Hallo,
    ich habe ein Problem, und zwar stürzt mein Programm immer ab.
    Ich habe zwei Klassen:

    class K1
    {
    void Init(){stPointer=new Struktur[num]};
    
    Struktur *stPointer;
    int num;
    }
    
    class K2 : public K1
    {
    K1 *Dinge;
    int num2;
    
    void Load()
       {
       Init();
    
       Dinge = new K1[num2];
       Dinge[0]->Init();       //hier der Absturz
       }
    }
    

    Was der Fehler sein könnte ist, dass
    Dinge[0]->Init(); nicht auf K2::Dinge::stPointer; sondern auf K2::stPointer zugreift. Wisst ihr auf was da zugegriffen wird?

    Peter->Dank(SEHR_VIEL);



  • Du hast mehrere Fehler in deinem Programm.

    Du willst anscheinend ein dynamisches Array von "Kl"-Objekten anlegen, dann solltest du besser die Klasse "std::vector" benutzen, denn sonst ist "Dinge[0]" bisher uninitialisert und deshalb crasht es dort.

    Außerdem ist im Konstruktor der Klasse Kl die Variable "num" noch uninitialisiert (d.h. dort steht ein zufälliger Wert drin) und zu guter letzt fehlen noch in beiden Klassen die Destruktoren, welche jeweils mit "delete [] ..." den jeweiligen Speicher wieder freigeben sollten.



  • Die Variable num wird schon initialisiert, das hab ich nur weggelassen.
    Und mit Vektoren hab ich es auch versucht, auch abgestürzt.
    Was ich eigentlich wissen will ist, auf welche stPointer Dinge[X]->Init();
    zugreift.



  • Dinge = new K1[num2];

    das erzeugt zwar nen array von pointern auf K1, die pointer referenzieren aber noch auf nix. der folgende aufruf von Dinge[0] schiesst somit ins leere.

    du musst das array anlegen und anschliessend für jedes element auch noch den speicher reservieren (new K1)



  • Unfug! Das ist ein Array von K1, nicht von Pointern auf K1. Folglich ist die Verwendung von Dinge[0] zulässig. Das hier allerdings:

    Dinge[0]->Init();

    sollte gar nicht kompilieren (es sei denn K1 überläd operator->). Sorry, aber mit so bruchstückhaftem Code ist es nun wirklich nicht möglich den Fehler ausfindig zu machen.



  • hey tatsächlich. wenn man nochmal in den code guckt, stellt man fest, dass es ja gar keine pointer sind. danke für den freundlichen hinweis du arsch.



  • ja und auf welches stPointer wird in Dinge[xyz]->Init() dann zugegriffen?



  • Poste uns erstmal korrekten Code, dann sehen wir weiter...



  • Also wenn ich das richtig sehe, muss es schlicht und ergreifend

    Dinge[0].Init();
    

    statt

    Dinge[0]->Init();
    

    heißen, da Init() ja ein(e) Element(methode) von K1 ist.


Log in to reply