Eigene Klasse von wx zu QT portieren



  • Hallo Forum,
    ich bin bei meinen Qt gehversuchen schon wieder auf ein Problem gestoßen. Mein Programm was ich mit Wx geschrieben hatte, versuche ich nun grad mit Qt umzusetzen. Dabei hatte ich mir in wx eine eigene klasse geschrieben in der ich verschiedene Daten zwischen gespeichert habe. Nun hab ich versucht den Code in Qt zu übernehmen, das führt aber kurz gesagt zu einem Programmabsturz. Also hab ich die Klasse auf ein minimum reduziert um die Fehlerquelle zu finden, was mir aber nicht gelungen ist ....

    #ifndef STORAGE_H
    #define STORAGE_H
    
    #include <QObject>
    
    class Storage : public QObject
    {
        Q_OBJECT
    
    public:
        Storage(int a = 0);
        ~Storage();
        virtual void setID(int a);
        virtual int getID();
    
    private:
        static int myID;
    
    };
    
    #endif // STORAGE_H
    
    #include "storage.h"
    
    int Storage::myID = 0;
    
    void Storage::setID( int a)
    {
        myID = a;
    }
    
    int Storage::getID()
    {
        return myID;
    }
    

    Wenn ich nun ....

    Storage *lager;
    lager->setID(i);
    

    ... ausführe stürzt das Programm .... beim kompilieren kommt auch die meldung das lager uninitilisiert sein könnte ....

    für Hilfestellung wäre ich sehe dankbar ....

    P.S.:

    Die klasse wie sie in wx problemlos funktionierte

    #ifndef STORAGE_H_INCLUDED
    #define STORAGE_H_INCLUDED
    
    #include "wx/datetime.h"
    
    class Storage {
    
    public:
        // ctor
        Storage(int a = 0);
    
        // copy ctor
        Storage( const Storage &right);
        // dtor
        virtual ~Storage();
        // assignment operator
        //const Storage& operator=(const Storage &right);
    
        // public member functions
        public:
            // Set Funktionen
            virtual void setID(int a);
            virtual void setLevel(int a);
            virtual void setPersoID(int a);
            virtual void setItem(int a);
            virtual void setVaname(wxString a);
            virtual void setVadate(wxDateTime a);
            virtual void setLoc(int a);
            virtual void setPricekat(int a);
            virtual void setStart(int a, int b);
            virtual void setEnd(int a, int b);
    
            // Get Funktionen
            virtual int getID();
            virtual int getLevel();
            virtual int getPersoID();
            virtual int getItem();
            virtual int getLoc();
            virtual wxString getVaname();
    
        private:
            static int myID;
            static int myLevel;
            static int prodid;
            static int persoid;
            static wxString vaname;
            static wxDateTime vadate;
            static int vaort;
            static int vapricekat;
            static wxDateTime vastart;
            static wxDateTime vaend;
    };
    
    #endif // STORAGE_H_INCLUDED
    


  • Hallo nalamar,

    das Problem liegt m.E. nicht an der Klasse sondern an dem Code mit dem du setID aufrufst. Der kann eigentlich auch bei wxWidgets nicht funktioniert haben.

    Du erstellst mit:

    Storage *lager;
    

    einen Zeiger. Und da hat der Compiler auch recht denn dieser Zeiger ist uninitialisiert. Der zeigt nämlich irgendwo in die "Pampa".

    Ein aufrufen führt dann logischer weise zu einem crash. Das muss eher so aussehen:

    Storage *lager = new Storage();
    

    wobei du dann auch sobald du das Objekt nicht mehr brauchst ein:

    delete lager;
    

    aufrufen musst.
    Oder du erstellst das Objekt anstatt mit

    new
    

    auf dem Heap einfach so:

    Storage lager;

    auf dem Stack. Dann brauchst du dich auch nicht um das aufräumen mit delete kümmern weil es automatisch am Ende des Scope gelöscht wird.



  • nalamar schrieb:

    Storage *lager;lager->setID(i);
    

    Dieser Code kann selbst unter wxWidgets nicht funktionieren.

    *lager ist ein Pointer und zeigt irgendwo in den Speicher, ganz sicher nicht auf eine initialisierte Storage-Klasse. Entweder musst du `Storage *lager = new Storage' schreiben oder du hast uns den Code dazwischen nicht gezeigt.



  • Ack, ihr hatte ja sowas von recht ... unter wx hab ich auch Storage lager; aufgerufen ..... ich brauch mehr schlaf.

    Trotzdem löst das nun mein Problem noch nicht ganz, denn wenn ich den * nun mal einfach so wegnehme erhalte ich nun:

    collect2: ld returned 1 exit status

    EDIT:

    debug/mainwindow.o:mainwindow.cpp:(.text$_ZN7StorageC1Ev[Storage::Storage()]+0x20): undefined reference to `vtable for Storage'


  • Mod

    Solange die Klasse nur ein simpler Datencontainer ist, brauchst du afaik nicht von QObject ableiten.



  • Danke, wollte gerade posten das ich diese Lösung auch gefunden habe ...

    Vielen Dank an alle für die Hilfe und die Geduld ! 😃



  • Warum ist deine ID statisch? Wenn du das hier machst:

    Storage s1(5);
    Storage s2(7);
    std::cout << "s1: " << s1.getID() << "\t s2" << s2.getID();
    

    sollte zweimal 7 ausgegeben werden ... ist das so beabsichtigt?

    Dein wx Container hat nur static members ... noch dazu alle als private deklariert ... die getter setter sind alle virtual ... was wird das wenns fertig ist?



  • Statisch sind sie deswegen, weil ich in verschiedenen Funktonen die Variable update bzw. auslese.


Anmelden zum Antworten