Const bei Template-Forward-Klassen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Const bei Template-Forward-Klassen

Beitrag von Xin » Mi Aug 20, 2014 5:34 pm

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?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Const bei Template-Forward-Klassen

Beitrag von nufan » Mi Aug 20, 2014 11:02 pm

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 ) ) {}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Const bei Template-Forward-Klassen

Beitrag von Xin » Do Aug 21, 2014 8:27 am

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten