Question

J'ai une classe C ++ qui surcharge l'opérateur [] , l'opérateur de tableau indice / support. Ceci est terriblement pratique en dehors de ma classe, où je peux écrire foo [bar ]. Cependant, je ne comprends pas comment utiliser cette notation lorsque je mets en œuvre les méthodes dans de ma classe.

Je sais que je peux écrire opérateur [] (barre) ou this- > opérateur [] (barre) , mais ceux-ci sont assez difficiles à manier et enlèvent beaucoup de la commodité de l'opérateur en premier lieu. (Je sais aussi que je peux juste ajouter une nouvelle méthode qui appelle l'opérateur.) Est-il possible d'écrire this [bar] ou this- > [bar] ou quelque chose de pareil?

Remarque : Cette question peut également s'appliquer aux nombreux opérateurs unaires (par exemple, comment appeler foo ++ dans la classe?), mais personnellement, je ne me soucie que de opérateur [] .

Éditer : j'ai vite réalisé que je pouvais utiliser (* ceci) [barre] . Jusqu'à présent, toutes les réponses l'ont également suggéré. Y a-t-il d'autres alternatives?

Était-ce utile?

La solution

(*this)[bar];

fonctionne bien pour moi.

Autres conseils

Une alternative à (* this) [bar] consiste à utiliser une fonction membre nommée qui effectue le travail de opérateur [] . Les opérateurs surchargés facilitent la tâche de vos utilisateurs. Plus important encore, ils font partie de l'interface de votre classe. Demandez-vous s'il est vraiment logique d'implémenter votre classe en termes de sa propre interface publique. Sinon, je suggère d’écrire une fonction membre séparée (protégée ou privée) pour effectuer le travail, puis de demander à opérateur [] et à toute autre fonction de l’appeler.

J'utilise une fonction at () et je demande à l'opérateur [] d'appeler la fonction at () en coulisse; l'opérateur [] n'est donc qu'un sucre syntaxique. C'est comme ça que std :: vector le fait, donc cela semble être un moyen raisonnable (avec priorité) de le faire.

Maintenant, passons à un hack de sucre syntaxique complet (je ne peux pas dire que je le recommande tout à fait, mais cela pourrait vous plaire):

class Widget
{
    Widget&     self;
public:
    Widget() :self(*this)
    {}

    void operator[](int)
    {
        printf("hello");
    }

    void test()
    {
        //scripting like sugar
        //you pay the price of an extra reference per class though
        self[1]; 
    }
};


int main(int argc, char* argv[])
{
    Widget w;
    w[1];
    w.test();
    return 0;
}

De même, si vous souhaitez le faire gratuitement, sans payer le coût de la référence, ET vous êtes adepte d'une secte perverse vouée à faire souffrir les programmeurs, vous pourriez le faire:

#define self (*this)

En fait, je pense que c'est ainsi que la plupart des poignées sont implémentées dans l'API NS d'Apple ...

Utiliser

(*this)[bar]

pour appeler l'opérateur [] de l'objet d'instance.

this [bar] traite le pointeur en tant que tableau et indexe le élément de ce tableau (renvoyant un référence d'objet invalide).

Vous pouvez utiliser (* ceci) [bar] , mais il ne s’agit peut-être pas vraiment d’une amélioration ...

 operator[](bar) 

Cela devrait fonctionner aussi. Cela fonctionne pour moi!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top