Seite 1 von 1

QPointer mit const T*

Verfasst: 22. September 2009 09:57
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...

Verfasst: 22. September 2009 11:40
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?

Verfasst: 22. September 2009 13:04
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