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 ->
?
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 ->
?
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;
}
que se passe-t-il si le func() de S a été déclaré comme tel: virtual void func() = 0; – hero
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. –
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
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.
surchargeant l'opérateur -> de la classe O, qui retourne maintenant S * au lieu d'un O *
Par défaut, la classe O n'a pas d'opérateur -> qui renvoie un O *. –
Chaque fois un objet de type O utilise l'opérateur -> un pointeur à SES sera retourné.
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.
"With suce overload" => Vouliez-vous dire "tel" ou "suce" le nom de l'opérateur '->'? (non-anglophone demandant) – ereOn
@ereOn: Correction, qui étaient des fautes de frappe. – sharptooth
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. –