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 verlorenWas muss ich veränder dass es klappt?
-
Du bestimmst doch mit const, dass das Objekt nicht geänderd wird, versuchst es aber dennoch.
-
Nun,
a::b::b()erwartet eina*, keinenconst a*, den du ina::getBObject()alsthishast, daa::getBObject()selber const ist. Entweder ist das dort ina::b::b()falsch, dann musst du es dort ändern odera::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_HQAbstractItemModel* PLAYERHOLDER::model() const { if (m_model = 0) m_model = new CONTACTMODEL(this); return m_model; }
-
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