2009-10-08 7 views
3

je suis tombé sur cet exemple here:pourquoi avons-nous besoin à la fois const et getters non-const dans cet exemple

#include <vector> 
#include <cstddef> 

template<typename Tag> 
class Ref_t { 
    std::size_t value; 

    friend Tag& element(Ref_t r, std::vector<Tag>& v) { 
    return v[r.value]; 
    } 

    friend const Tag& element(Ref_t r, const std::vector<Tag>& v) 
    { 
    return v[r.value]; 
    } 
public: 
    // C'tors, arithmetic operators, assignment 

}; 

struct A{}; 
struct B{}; 

typedef Ref_t<A> ARef_t; 
typedef Ref_t<B> BRef_t; 

int main() { 
    std::vector<A> va; 
    ARef_t ar; 
    A& a = element(ar, va); 

} 

La question est de savoir pourquoi nous avons besoin -Deux friend element fonctions en classe Ref_t?

+0

Copie possible de [Même fonction avec const et sans - Quand et pourquoi?] (Https://stackoverflow.com/questions/27825443/same-function-with-const-and-withwith-when-and-why) –

Répondre

4

La différence entre les deux fonctions est qu'un element() d'un vecteur non-const est lui-même non-const, mais si le vecteur entier est const, alors chaque element() est aussi const.

à savoir

int main() { 
    std::vector<A> const cva = foo(); 
    ARef_t ar; 
    A const& a = element(ar, cva); 
} 
+0

+1 Super ... Comment ne pas l'avoir vu:) ... Agh, il est 7h40 aux USA – vehomzzz

0

Vous n'avez pas, vous avez seulement besoin de la version non const dans cet exemple

+1

Voir MSalters réponse: l'argument de la version const est lui-même const. Si vous voulez appeler la fonction avec un paramètre const, vous avez besoin de la version const. –

+0

@Kristoff - oui, ce que vous voulez dire? La version const n'était pas nécessaire dans l'exemple donné de la même manière que la version non const n'est pas nécessaire dans l'exemple MSalters. – Patrick

+0

Oui, mais cela est censé être une classe polyvalente, et la question concerne particulièrement les situations où cela serait nécessaire. – UncleBens

1

Si vous détenez un vecteur const vous pouvez lire les valeurs des éléments, mais pas les modifier. Si vous avez un vecteur non-const, vous pouvez réellement modifier les valeurs des éléments. Dans les deux cas, vous appelez la même fonction nom, mais une fonction différente est appelée en raison de la surcharge sur const.

L'opérateur [] sur le vecteur lui-même est également implémenté.

En effet, le « setter » non-const « getter » agit également comme un

0

deux fonction retourne l'élément de vecteur respectif de coller le comportement des éléments du vecteur.

c.-à-d. Si le vecteur est const ==> tous ses éléments sont const ==> on ne peut pas modifier son élément et pour cette fonction avec le type const return et l'argument const est défini. donc il ne permettra pas de modifier l'élément de vecteur.

Exactement en face est pour vecteur non-const. On peut modifier l'élément de vecteur en utilisant sa référence.

Questions connexes