Konvertierung von const Object const* to Object*



  • Hi,

    Ich stehe gerade vor einem kleinen Problem mit der Übergabe von einem Object.
    Meine Klassen sind so aufgebaut:

    class a
    {
    
      class b
      {
        public:
          explicit b(a* aobject);
        private:
          static a* aobject;
      };
    
    public:
        static a* getInstance();
        b* getBObject() const;
    
    private:
        a();
        static a *aobject;
        mutable b *bobject;
    
    }
    

    Bei der Implementierung der Funktion getBOject() tritt immer ein Fehler auf:

    b* a::getBOject() const
    {
        //Im Konstruktor von a wird bobject als 0 initialisiert.
        if (bobject = 0)
            bobject = new b(this);
    
        return bobject;
    }
    

    Dort tritt immer der Fehler auf:
    a:🅱:b(a*)': Konvertierung des Parameters 1 von 'const a *const ' in 'a*' nicht möglich
    Durch die Konvertierung gehen Qualifizierer verloren

    Was muss ich veränder dass es klappt?



  • Du bestimmst doch mit const, dass das Objekt nicht geänderd wird, versuchst es aber dennoch.


  • Mod

    Nun, a::b::b() erwartet ein a* , keinen const a* , den du in a::getBObject() als this hast, da a::getBObject() selber const ist. Entweder ist das dort in a::b::b() falsch, dann musst du es dort ändern oder a::getBObject() kann nicht const sein.

    ⚠ Aber: Sofortige Designnotbremse! ⚠
    Als jemand, der nicht einmal einen Vergleich richtig hinbekommt (Zeile 4), kannst du mir nicht erzählen, dass diese Klassenstruktur irgendwie sinnvoll wäre. Was sollen diese Relationen darstellen? Das ist der wirrste Zusammenhang zwischen Klassen, den ich jemals gesehen habe.



  • Ich hatte den Code nur etwas umgeschrieben heir kann ich dir mal die richtige Klasse zeigen:

    #ifndef PLAYERHOLDER_H
    #define PLAYERHOLDER_H
    
    #include <QtCore>
    #include <player.h>
    #include <datasource.h>
    
    class PLAYERHOLDER
    {
    
        class CONTACTMODEL : public QAbstractTableModel
        {
            Q_OBJECT
        public:
            explicit CONTACTMODEL(PLAYERHOLDER* holder);
    
            int rowCount( const QModelIndex &parent ) const;
            int columnCount( const QModelIndex &parent ) const;
            QVariant data( const QModelIndex &index, int role ) const;
            QVariant headerData( int section, Qt::Orientation orientation, int role ) const;
    
        private:
            static PLAYERHOLDER* m_playerHolder;
        };
    
    public:
        static PLAYERHOLDER* getInstance();
        void createPlayer(PLAYER *player);
        void updatePlayer(int id);
        void deletePlayer(int id);
        PLAYER* findPlayer(int id);
        void loadPlayers(int teamid);
    
        QAbstractItemModel* model() const;
    
    private:
        PLAYERHOLDER();
        static PLAYERHOLDER *thePlayerholder;
        QHash<int, PLAYER*> playerlist;
        DATASOURCE *datasource;
        mutable CONTACTMODEL *m_model;
    };
    
    #endif // PLAYERHOLDER_H
    
    QAbstractItemModel* PLAYERHOLDER::model() const
    {
        if (m_model = 0)
            m_model = new CONTACTMODEL(this);
    
        return m_model;
    }
    

  • Mod

    Erklärung und Lösung des Problems sind immer noch die gleiche, der Vergleich ist auch immer noch falsch, die Klassenstruktur ist immer noch höchst wirr.



  • Die Klasse PLAYERHOLDER stellt das API der Datenhaltung zu Verfügung, würde ich das QAbstractTableModel außerhalb implementieren würde es ein Duplikat der Daten haben oder die Kasse PLAYERHOLDER muss mehrere Methoden zur Verfügung stellen um die View zu Versorgen. Diese nested class struktur wird von QT empfholen


Anmelden zum Antworten