2012-02-13 3 views
1

Je suis tombé par hasard sur ce code qui me confond vraiment:C++/syntaxe/adressage fonction membre

SomeObject->SomeFunction()->AnotherFunction(...); 

Quel est le sens de la deuxième flèche -> qui suit l'appel à SomeFunction() fonction membre?

P.S. SomeFunction() fonction est déclarée dans une classe comme ceci:

const int * SomeFunction() {return ipValue;} 
+4

si SomeFunction retourne int, qui ne sera pas même compiler – pezcode

+0

Cela ne devrait pas compiler, car un 'int' ne dispose pas d'une fonction membre AnotherFuntion'. – crashmstr

+1

Vérifiez à nouveau, SomeFunction doit retourner un pointeur vers une classe. – jrok

Répondre

3

SomeFunction()SomeFunction()SomeFunction()SomeFunction() renvoie un pointeur vers une classe dont l'une de ses méthodes (appelée AnotherFunction) est invoquée. Si vous cassez vers le haut, il pourrait ressembler à ceci:

Object* obj = SomeObject->SomeFunction(); 
obj->AnotherFunction(); 

Comme déjà mentionné, si SomeFunction() retourne un int * cela ne fonctionnera pas.

+2

Comme déjà mentionné, si SomeFunction() renvoie un int * cela ne fonctionnera pas. – Kaganar

+0

SomeFunction() renvoie un 'const int *'. C'est spécifié dans la question. –

+0

Merci beaucoup! Cela a répondu à ma question! –

1

Cela signifie que la méthode SomeFunction() retourne une sorte de pointeur ou objet pointeur semblable sur lequel à son tour AnotherFunction() est appelé.

Cela signifie que l'opérateur -> a exactement la même signification, peu importe où il apparaît dans vos expressions.

EDIT:

Étant donné que le type de retour est int (avant la modification) le code ne compilera pas comme indiqué. Comme vous pouvez le voir here, le compilateur se plaint de l'opérande -> n'étant pas un pointeur. Si vous modifiez le type de retour à int *, il ne sera toujours pas compilé, car l'opérateur -> peut uniquement être appelé sur des pointeurs vers des types de classe, mais pas sur des pointeurs vers des types fondamentaux tels que int. Here est un exemple avec un int * et le message d'erreur approprié.

+0

Oups, juste noté le type de retour que vous avez donné pour 'SomeFunction()'. Dans ce cas, il y a beaucoup de choses qui ne vont pas. Cela ne compilera pas, et le 'const' dans le type de retour est absolument sans signification pour le compilateur (mais peut parfois être utilisé comme documentation). – LiKao

+0

Et voici la preuve, qu'il ne compile pas la façon dont vous l'avez décrit: http://ideone.com/9zCTr – LiKao

+0

Pourquoi était-ce downvoted? – LiKao

3

C'est une erreur de compilation. Est un type de base, pas une classe, donc vous ne pouvez pas appeler des méthodes dessus.

Cette technique est appelée chaînage de méthode. Vous pouvez appeler des méthodes ultérieures si la fonction membre renvoie un objet ou un pointeur sur un objet. Dans votre cas, il ne compile pas puisque la méthode renvoie un int. Cependant, quelque chose comme ce qui suit fonctionnerait:

class A 
{ 
public: 
    A* foo(); 
    A* goo(); 
}; 

A* a = new A; 
a->foo()->goo()->foo(); 
Questions connexes