QPointer mit const T*

Alles rund um die Programmierung mit Qt
Antworten
AlGaN
Beiträge: 25
Registriert: 25. März 2006 12:45

QPointer mit const T*

Beitrag von AlGaN »

Hallo,

ich habe in mehreren Klassen einen Zeiger auf eine andere Klasse Map gespeichert, der sich ziemlich oft ändern kann. deshalb ist mir die Idee gekommen, diesen in einem QPointer zu speichern, also:

Code: Alles auswählen

QPointer<Map> mCurrentMap
Laut Doku wird der QPointer ja auf 0 gesetzt, wenn das darunterliegende Objekt gelöscht wird. Leider lässt sich so kein const-Pointer speichern, also:

Code: Alles auswählen

QPointer<const Map>
wenn ich dann einen const-Zeiger zuweisen will mit

Code: Alles auswählen

void setCurrentMap(const Map* map)
{
    mCurrentMap = map;
}
bekomme ich einen Fehler:
d:\programme\qt\4.5.2\include\qtcore\../../src/corelib/kernel/qpointer.h(68) : error C2664: 'QMetaObject::changeGuard' : cannot convert parameter 2 from 'const Map *' to 'QObject *'
Conversion loses qualifiers
d:\programme\qt\4.5.2\include\qtcore\../../src/corelib/kernel/qpointer.h(68) : while compiling class template member function 'QPointer<T> &QPointer<T>::operator =(T *)'
with
[
T=const Map
]
was daran liegt, dass intern QPointer eben ein QObject* o speichert.

Um dennoch zu verhindern, dass das den QPointer enthaltene Objekt die Map ändern kann, muss ich als Workaround

Code: Alles auswählen

class A
{
private:
    QPointer<Map> mCurrentMap;

public:
    void setCurrentMap(const Map* map)
    {
        mCurrentMap = const_cast<Map*>(map);
    }

    const Map* currentMap() const
    {
        return mCurrentMap;
    }
[...]
};
schreiben und dann intern immer über die get-Methode currentMap() arbeiten.

Deshalb meine Frage: Ist das ein Bug/Feature von QPointer, oder ist es nicht vorgesehen, Pointer auf const-Objekte zu speichern?

Danke für alle Hinweise...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wie soll sonst intern ein konstanter Pointer auf 0 gesetzt werden können wenn es ein const-Pointer innerhalb von QPointer wäre?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
AlGaN
Beiträge: 25
Registriert: 25. März 2006 12:45

Beitrag von AlGaN »

Code: Alles auswählen

class A
{
public:
    A() {
        mA = 1;
        cout << "A::A()" << endl;
    }
    
    ~A() { cout << "A::~A()" << endl; }

    int getA() const {
        return mA;
    }

    void setA(int a) {
        mA = a;
    }
    
private:
    int mA;
};

[...]

int main(int argc, char* argv[])
{
    A a1, a2;
    A* pA = &a1;
    const A a3, a4;
    const A* pcA = &a3;
    pcA = 0;                     // korrekt
    pcA = &a4;                 

    return 0;
}
obiger Code kompiliert einwandfrei, ich meinte einen non-const Pointer auf ein konstantes Objekt, also

Code: Alles auswählen

const A* pA
, nicht einen const-Pointer auf ein (evt. konstantes) Objekt

Code: Alles auswählen

const A *const
Antworten