2009-03-31 9 views
1

J'ai surchargé l'opérateur [] dans ma classe. Existe-t-il un moyen plus agréable d'appeler cette fonction à partir de ma classe autre que (*this)[i]?(* ceci) [i]?

+0

Près dupliquer de http://stackoverflow.com/questions/681746/2d-matrix-and-overloading-operator-ugly-syntax – ephemient

Répondre

8
fonction

add à (size_t i) et utiliser cette fonction

EDIT
si vous en utilisant activement stl éviter inconsistance sémantique: dans std::vector operator[] ne vérifie pas si l'index est valide , mais à (..) vérifier et pourrait jeter std::out_of_range exception. Je pense que dans le projet avec plus de stl un comportement similaire sera attendu de votre classe.
Peut-être que ce nom n'est pas le meilleur pour cette fonction.

+0

Je suppose que c'est à peu près ce que je peux faire de mieux, merci. – mpen

7

Eh bien, vous pouvez utiliser "operator [] (i)".

6

pas agréable, mais explicite:

this->operator[](i) 

Si vous trouvez que vous devez faire beaucoup, créez une fonction A() qui fait exactement ce que l'opérateur [] fait. Vous pouvez alors dire:

this->At(i) 
+1

Je ne suis pas sûr que je recommanderais d'ajouter un 'at' qui fait * exactement * la même chose que opérateur[]. Cela part du précédent établi par la norme. –

+0

OK, appelez-le At() –

+0

Je ne recommanderais pas de dupliquer le code (je doute que c'est ce que suggère Neil), mais il n'y aurait rien de mal à avoir l'opérateur []() appeler at() ou At (). –

0

this->[i] ne compile même pas. La seule autre option est this->operator[](i).

+1

Vous n'avez pas besoin de "this->" devant un appel de méthode. –

6

Cela pourrait être un compromis raisonnable:

T& me = *this; 

// ... 

me[i]; 
+0

Serait bien si C++ avait un type spécial intégré pour * ceci. PHP a "self" mais ce n'est pas tout à fait la même chose. En tout cas, merci pour la suggestion :) – mpen

+1

Selon Stroustup, 'ceci' aurait probablement été une référence, sauf que les références sont arrivées trop tard dans l'évolution du C++. –

+0

Dommage qu'il ne revienne pas et réécrive tout pour être centré sur la référence quand c'est arrivé. Cela aurait été une langue bien meilleure. –

4

Puisque vous acessing quelque chose à partir de votre propre classe, pourquoi ne pas simplement utiliser une fonction privée, nommée comme bon vous semble:

class MyClass 
{ 
    private: 
     SomeType& Item(int index) { /* return a value */ } 
    public: 
     SomeType& operator[](int index) { return Item(index); } 
     void SomeFunction(void); 
} 

void myClass::SomeFunction(void) 
{ 
    SomeType localVar = Item(42); // internal access 
} 

int main(int argCount, char ** argList) 
{ 
    MyClass myClass; 
    SomeType x; 

    x = myClass[42]; // external access 

    return 0; 
} 
+0

Cet exemple est un peu exagéré pour votre point, mais merci :) +1 pour l'effort – mpen

+0

Haha vrai. Je ne savais pas où m'arrêter:) –