Konvertierung zu Pointer auf Konstante



  • Danke, das hat mir auf jeden Fall weitergeholfen. Hier noch eine darauf aufbauende Frage:

    Angenommen ich möchte nicht eine Kopie von part_nodes, sondern einen Zeiger auf part_nodes zurückgeben, der dem Benutzer von get_part_nodes() erlaubt, part_nodes zu lesen, aber nicht zu verändern. Wie macht man das am besten?

    Die folgende Lösung wird ja wohl nicht gehen, da ich eine Referenz auf ein lokales Objekt zurückgebe, dessen Destruktor nach verlassen des Gültigkeitsbereichs von get_part_nodes() aufgerufen wird.

    class partition_tree
    {
    private:
        vector<partition_node*> part_nodes;
    public:
        const vector<const partition_node*>* get_part_nodes() 
        { 
            return &(vector<const partition_node*>(part_nodes.begin(), part_nodes.end())); 
        }
    };
    

    Wenn ich stattdessen new benutze, wäre der Benutzer von get_part_nodes() doch gezwungen die Rückgabe von get_part_nodes() mittels delete zu löschen?

    Und allgemeiner gefragt: Wenn man eine Variable wie part_nodes in einer Klasse hat und diese Variable mit einer Methode get_part_nodes() zum Nur-Lesen herausgeben will, wie macht man das am besten? Insbesondere: Geht das auch irgendwie ohne Kopieraktionen?


  • Mod

    Warum muss es denn unbedingt ein vector sein? Wenn man nur Lesen will, dürfte eine einfache Sequenz ausreichen, und man spart so unnötiges Kopieren. Wenn der Aufrufer unbedingt einen vector haben will, kann er den ja immer noch initialisieren.

    class partition_tree
    {
    private:
        vector<partition_node*> part_nodes;
    public:
        std::pair<vector<partition_node*>::const_iterator, vector<partition_node*>::const_iterator> get_part_nodes() const { return make_pair(part_nodes.begin(),part_nodes.end()); }
    };
    

    nebenbei: vergiss const-Rückgaben. Die sind fast immer großer Blödsinn.



  • camper schrieb:

    nebenbei: vergiss const-Rückgaben. Die sind fast immer großer Blödsinn.

    Was würden denn dagegen sprechen:

    class partition_tree
    {
    private:
        vector<partition_node*> part_nodes;
    public:
        const vector<const partition_node*>& get_part_nodes() const
        {
            return part_nodes;
        }
    };
    

    ?



  • nichts, aber der OP macht eine rückgabe per value, hat also eine konstante kopie.

    und sowas verwendet man idR auch nur bei überladung gewisser operatoren - selbst da ist die verwendung umstritten und dient nur dem zweck, user-defined typen den builtins ein bisschen ähnlicher zu machen. (und ich weiß zufällig, das camper auch auf diesen einsatz von const-rückgaben gar nicht steht).


  • Mod

    Badestrand schrieb:

    camper schrieb:

    nebenbei: vergiss const-Rückgaben. Die sind fast immer großer Blödsinn.

    Was würden denn dagegen sprechen:

    class partition_tree
    {
    private:
        vector<partition_node*> part_nodes;
    public:
        const vector<const partition_node*>& get_part_nodes() const
        {
            return part_nodes;
        }
    };
    

    ?

    Dass es nicht möglich ist?



  • queer_boy schrieb:

    nichts, aber der OP macht eine rückgabe per value, ...

    Badestrand schrieb:

    const vector<const partition_node*>& // <- Hier steht allerdings ein &
    

    Aber wenn camper schreibt, dass das verboten sei, glaube ich ihm das....

    Gruß,

    Simon2.



  • er bezieht sich in seinem letzten posting ja nur darauf, dass vector<X*> und vector<const X*> zwei verschiedene typen sind...


  • Mod

    ah sorry, es ging ja eigentlich darum, dass auch die Zeiger konstant sein sollen, ein const_iterator genügt da nat. noch nicht:

    class partition_tree
    {
    private:
        vector<partition_node*> part_nodes;
    public:
        std::pair<const partition_node* const*, const partition_node* const*> get_part_nodes() const { return make_pair(&*part_nodes.begin(),&*part_nodes.end()); }
    };
    


  • Ich denke hier wäre vielleicht ein typedef angebracht. 🙂



  • camper schrieb:

    Badestrand schrieb:

    Was würden denn dagegen sprechen:

    class partition_tree
    {
    private:
        vector<partition_node*> part_nodes;
    public:
        const vector<const partition_node*>& get_part_nodes() const
        {
            return part_nodes;
        }
    };
    

    ?

    Dass es nicht möglich ist?

    Ich meinte eigentlich ohne das "const" im Template-Parameter... Aber ok, dann wär's Unfug, weil man die Objekte verändern könnte.


Anmelden zum Antworten