2010-04-10 24 views
6

En C++, puedo cambiar de operador en una clase específica haciendo algo como esto:sobrecarga de operadores en C

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

Pero sin que existan clases (construido en forma predeterminada) en C. Entonces, ¿cómo ¿podría hacer una sobrecarga del operador solo para funciones generales?

Por ejemplo, si mal no recuerdo, la importación de stdlib.h le proporciona el operador ->, que es simplemente azúcar sintáctica para (* nombre_de_arranque) .struct_element.

Entonces, ¿cómo puedo hacer esto en C?

Gracias.

+0

No estoy seguro de lo que está diciendo al decir "no hay clases (integradas por defecto)", pero no hay clases en C, punto. Built-in o de lo contrario. ¿Y qué quiere decir con la sobrecarga del operador para las funciones? Eso no tiene sentido. – meagar

+0

Bueno, puede crear un modelo de objeto en C con clases, pero no lo hará mediante el uso de sintaxis que no sea la sintaxis C simple. Para mis intentos de esto, vea http://jonsterling.github.com/2009/08/28/implementing-object-oriented-programming-in-pure-c.html y http://jonsterling.github.com/2009 /09/07/objeto-oriented-programming-in-c-mark-two.html. –

+0

Jonathan tenía la intuición adecuada sobre lo que estaba sufriendo. Estaba diciendo que podrías forzar a C a un modelo OOP. –

Respuesta

15

La antigua C no tiene sobrecarga del operador de ninguna forma. El "operador" -> para acceder a un miembro de un puntero es estándar C y no lo introduce ningún archivo de encabezado.

+0

De hecho. '->' es solo una sintaxis especial porque los punteros a las estructuras son muy comunes. – avpx

+0

Ya veo. Entonces, básicamente, el único tipo de sobrecarga del operador sería algún tipo de directiva de preprocesador, por ejemplo: #define plus (a, b) a + b. Sin embargo, eso no permitiría ninguna forma de parámetros, a menos que de alguna manera pueda obtener que cambie ayb a los nombres de los parámetros reales ... –

+5

@Leif: no creo que una macro sea apropiada para lo que eres diciendo. Si desea que 'struct foo' tenga alguna noción de adición, entonces típicamente definiría una función' foo add_foos (foo lhs, foo rhs) 'o algo así. No hay necesidad de involucrar al preprocesador en esto. Si cambia a C++ más tarde, puede sobrecargar '+' para llamar a 'add_foos'. –

1

El operador de desreferenciación del puntero de estructura -> es parte de la especificación C. stdlib.h no afecta esto.

+0

Ratas, está bien, gracias. Recuerdo que un estudiante de posgrado en mi universidad me dijo eso. –

+0

No confíes en que un estudiante de posgrado sepa algo sobre un idioma a menos que haya escrito una implementación de él mismo. :) – greyfade

5

Los operadores integrados en el lenguaje C son sobrecargados. El hecho de que puede usar el número binario + para sumar números enteros, números de coma flotante y realizar operaciones aritméticas del puntero es un ejemplo canónico de sobrecarga del operador.

Sin embargo, C no ofrece funciones para la sobrecarga del operador a nivel de usuario. No puede definir sus propios operadores en C.

1

Claro, no puede sobrecargar operadores en C. El operador -> es parte del lenguaje C, no se necesita #include.

Cuestiones relacionadas