von nicht-const nach const



  • Hi,

    ich habe ein

    set<const Square*> squaresWithFoes;
    

    und eine Methode

    set<Square*> getBlackPiecedSquares()
    

    nun versuche ich eine Zuweisung:

    squaresWithFoes = board->getBlackPiecedSquares();
    

    Dies geht aber nicht. Wohl weil es für std::set keine entsprechende Operatiorüberladung für = von nicht const nach const gibt.

    Schade eigentlich, schließlich müsste es doch unproblematisch sein, von nicht const nach const zu gehen.

    Hat jemand eine Idee, wie ich die Zuweisung am besten hinbekomme?



  • Du musst wohl alle Pointer kopieren, finde das auch nervig.

    set<Square*> NonConst = getBlackPiecedSquares();
    squaresWithFoes = set<const Square*>( NonConst.begin(), NonConst.end() );
    


  • Oder du castest. Wozu brauchst du das?



  • erst mal danke für die beiden ideen.

    das mit dem casten funktioniert irgendwie nicht. Wenn ich einfach (set<const Square*>) davor schreibe, klappt das irgendwie nicht - hört sich auch etwas unmöglich an, bei einem container, oder?

    bezgl. der zweiten antwort:

    wozu brauchst du das?

    wozu brauche ich was?



  • Bit2_Gosu schrieb:

    wozu brauche ich was?

    Einen Container mit konstanten Daten.



  • Tjo, leider aus folgendem Grund:

    ich hatte ein

    map<Square*, bool> preSquares
    

    und rufe auf:

    preSquares.find(square)
    

    , wobei square ein

    const Square*
    

    ist, der meiner Methode als Argument übergeben wird.

    Leider gibt es die Methode find nur für Square*, weil das der Template Parameter für die map ist. Deshalb meckert der Compiler mit

    error: invalid conversion from ‘const Square*’ to ‘Square*’

    Deshalb war meine Idee, die Variable preSquares zu einer map<const Square*, bool> zu machen.

    Ich meine, wenn ihr eine bessere Idee habt, freu ich mich natürlich.



  • Du kannst nur const -Qualifizierer hinzufügen. Das sollte mit std::copy() gehen, eventuell auch mit einer Iterationsschleife durch den Container.



  • Bit2_Gosu schrieb:

    Leider gibt es die Methode find nur für Square*, weil das der Template Parameter für die map ist.

    Für einen solchen Fall könnte man ausnahmsweise auch mal den const_cast bemühen.



  • jo, ich machs jetzt auch mit const_cast.
    Ist am einfachsten und auch ungefährlich, weil die constness nur in der Methode entfernt ist und ich dort nicht schreibend zugreife.

    Vielen Dank für eure Tipps!



  • Bit2_Gosu schrieb:

    Ist am einfachsten und auch ungefährlich, weil die constness nur in der Methode entfernt ist und ich dort nicht schreibend zugreife.

    Ändere die Methode, dass sie const benutzt/zurückgibt.


Log in to reply