2010-04-10 4 views
6

En C++, je peux changer l'opérateur sur une classe spécifique en faisant quelque chose comme ceci:opérateur Surcharger en C

MyClass::operator==/*Or some other operator such as =, >, etc.*/(Const MyClass rhs) { 
    /* Do Stuff*/; 
} 

Mais être là pas de cours (construit par défaut) dans C. Alors, comment est-ce que je pourrais surcharger l'opérateur pour des fonctions générales? Par exemple, si je me souviens bien, l'importation de stdlib.h vous donne l'opérateur ->, qui est juste du sucre syntaxique pour (* strcut_name) .struct_element.

Alors, comment puis-je faire cela en C?

Merci.

+0

Je ne suis pas sûr de ce que vous sous-entendez en disant "pas de classes (intégrées par défaut)", mais il n'y a pas de classes en C, point. Intégré ou autrement. Et que voulez-vous dire la surcharge de l'opérateur pour les fonctions? Cela n'a pas de sens. – meagar

+0

Eh bien, vous pouvez créer un objet-modèle en C avec des classes, mais ce n'est pas en utilisant une syntaxe autre que la syntaxe C simple. Pour mes tentatives à ce sujet, voir http://jonsterling.github.com/2009/08/28/implementing-object-oriented-programming-in-pure-c.html et http://jonsterling.github.com/2009 /09/07/programmation-objet-oriented-in-c-mark-two.html. –

+0

Jonathan avait la bonne intuition de ce à quoi je souffrais. Je disais que vous pouviez forcer C dans un modèle OOP. –

Répondre

15

L'ancien C ne présente aucune surcharge de l'opérateur. Le -> "opérateur" pour accéder à un membre d'un pointeur est standard C et n'est pas introduit par un fichier d'en-tête.

+0

En effet. '->' est juste une syntaxe spéciale car les pointeurs vers les structures sont si communs. – avpx

+0

Je vois. Donc, fondamentalement, le seul type de surcharge de l'opérateur serait une sorte de directive du préprocesseur, disons: #define plus (a, b) a + b. Bien que, cela ne permettrait aucune forme de paramètres, sauf si vous pouvez en quelque sorte l'obtenir pour changer a et b pour les noms de paramètres réels ... –

+5

@Leif: Je ne pense pas qu'une macro est appropriée pour ce que vous êtes en disant. Si vous voulez que 'struct foo' ait une notion d'addition, alors vous définissez typiquement une fonction' foo add_foos (toto lhs, foo rhs) 'ou quelque chose comme ça. Il n'y a pas besoin d'impliquer le préprocesseur dans ce processus. Si vous passez en C++ plus tard, vous pouvez surcharger '+' pour appeler 'add_foos'. –

1

L'opérateur de déréférencement de pointeur de structure -> fait partie de la spécification C. stdlib.h n'affecte pas cela.

+0

Rats, d'accord, merci. Je me souviens d'un étudiant diplômé de mon université qui me l'a dit. –

+0

Ne faites pas confiance à un étudiant diplômé pour savoir quoi que ce soit à propos d'une langue à moins d'en avoir écrit une implémentation. :) – greyfade

5

Les opérateurs intégrés en langage C sont surchargés. Le fait que vous pouvez utiliser le binaire + pour additionner des nombres entiers, des nombres à virgule flottante et exécuter une arithmétique de pointeur est un exemple canonique de l'opérateur surchargeant. Cependant, C ne propose aucune fonctionnalité pour la surcharge de l'opérateur au niveau de l'utilisateur. Vous ne pouvez pas définir vos propres opérateurs dans C.

1

Bien sûr, vous ne pouvez pas surcharger les opérateurs dans C. L'opérateur -> fait partie du langage C, aucun #include nécessaire.