Seite 1 von 1

Const bei Template-Forward-Klassen

Verfasst: Mi Aug 20, 2014 5:34 pm
von Xin
Moin,

vielleicht fällt einem ja was sinnvolles zu meinem derzeitigem Problem ein:

Ich habe eine Klasse, die einen Shared-Pointer hält und nichts anderes tut, als auf eine Implementation zu verweisen:

Code: Alles auswählen

    class Segment : public SegmentInterface
    {
    private:
        shared_ptr< SegmentImpl const > _implementation;

    public:
        Segment( SegmentImpl const * impl )
            : _implementation( impl ) {}
...
        virtual bool setSource( Point2d & newPosition )   
        { return _implementation->setSource( newPosition ); }

...
Diese Segmente haben - dank des Pointers eine feste Größe und machen nichts weiter als auf die Implementierungsklassen zu verweisen. Da ich die Segmente mit Implementierungen erzeugen können muss, die const sind, muss mein Shared-Pointer auf ein const-Objekt (SegmentImpl) zeigen.
Das klappte bisher eigentlich wunderbar - nur nun muss ich Funktionen weiterleiten, die nicht als const deklariert sind.

Die Lösung für mein Problem wäre, wenn ich Segment erklären könnte, dass ich mit einem Konstruktor für (SegmentImpl const *) auch nur Segment-Elemente erzeugen kann, die const sind - die entsprechend die setSource-Funktion nicht rufen könnten.

Fällt dazu jemandem eine elegante Lösung ein, die über eine statische Frickelei hinaus reicht?

Re: Const bei Template-Forward-Klassen

Verfasst: Mi Aug 20, 2014 11:02 pm
von nufan
Naja spontan fällt mir nur ein grässlicher Cast ein:

Code: Alles auswählen

    private:
        shared_ptr< SegmentImpl > _implementation;

    public:
        Segment( SegmentImpl const * impl )
            : _implementation( const_cast<SegmentImpl *>( impl ) ) {}

Re: Const bei Template-Forward-Klassen

Verfasst: Do Aug 21, 2014 8:27 am
von Xin
Das entspricht grundsätzlich dem Gedanken, den ich implementiere.

Code: Alles auswählen

private:
        mutable shared_ptr< SegmentImpl > _implementation;

    public:
        Segment( SegmentImpl * impl )
            : _implementation( impl ) {}

        static Segment const Create( SegmentationImpl const * impl )
        { return Segment( const_cast<SegmentImpl *>( impl ) ) }
Der Copy-Construktor etc ist deleted (bzw. private), operator = () ist mehrfach überladen, entsprechend auch als operator =() const.

Ich versuche so ein (Segment const) sich so verhalten zu lassen, als wäre es ein shared_ptr< SegmentImpl const >. Aber schön ist das nicht - und vor allem viel Boilerplate.