2010-05-25 6 views
5

J'ai vu ce code, mais je ne pouvais pas comprendre ce qu'il fait:surcharge -> opérateur C++

inline S* O::operator->() const 
{ 
    return ses; //ses is a private member of Type S* 
} 

donc ce qui se passe maintenant, si je ->?

+0

BTW, c'est C++ seulement que le langage C ne permet pas la fonction ni la surcharge de l'opérateur. C'est un autre problème qui différencie les deux langues. –

Répondre

2

est que vous avez une instance de la classe O et vous

obj->func() 

alors la operator-> retourne et puis il des ses utilise le pointeur retourné appeler func().

Exemple complet:

struct S 
{ 
    void func() {} 
}; 

class O 
{ 
public: 
    inline S* operator->() const; 
private: 
    S* ses; 
}; 

inline S* O::operator->() const 
{ 
    return ses; 
} 

int main() 
{ 
    O object; 
    object->func(); 
    return 0; 
} 
+1

que se passe-t-il si le func() de S a été déclaré comme tel: virtual void func() = 0; – hero

+0

les fonctions virtuelles devraient au moins être protégées, mais de préférence privées. Il est de la responsabilité de la classe S de s'assurer que ses pointe vers un objet valide. –

+0

fonctions privées privées? Sauf si vous êtes plein de déclarations de classe d'amis, je pense que privé et virtuel sont la plupart du temps mutuellement exclusifs. – luiscubal

0

Il s'agit d'un opérateur surchargé qui renvoie un pointeur vers un membre de type S.

Comme, si vous écrivez

O object; 
(object->)... 

la partie (object->) deviendrait votre pointeur.

-1

surchargeant l'opérateur -> de la classe O, qui retourne maintenant S * au lieu d'un O *

+3

Par défaut, la classe O n'a pas d'opérateur -> qui renvoie un O *. –

0

Chaque fois un objet de type O utilise l'opérateur -> un pointeur à SES sera retourné.

11

Maintenant, si vous avez

O object; 
object->whatever() 

premier sera appelé operator-> surchargé, qui retournera ses stocké à l'intérieur de l'objet, puis operator-> (intégré dans le cas de S*) sera appelé à nouveau pour le pointeur retourné.

Alors

object->whatever(); 

est équivalent à pseudocode:

object.ses->whatever(); 

ce dernier serait bien sûr impossible puisque O::ses est private - c'est pourquoi je l'appelle pseudocode.

Avec une telle surcharge, vous pouvez créer un wrapper autour d'un pointeur - un tel wrapper est généralement appelé pointeur intelligent.

+0

"With suce overload" => Vouliez-vous dire "tel" ou "suce" le nom de l'opérateur '->'? (non-anglophone demandant) – ereOn

+0

@ereOn: Correction, qui étaient des fautes de frappe. – sharptooth