¿Puede una estructura de C comportarse como si tuviera una función?

13

Uso C y struct s donde una estructura puede tener miembros pero no funciones. Supongamos, para simplificar, que quiero crear una estructura para cadenas a las que nombre str y quiero poder hacer str.replace(int i, char c) donde i es el índice de la cadena y c es el carácter para reemplazar el carácter en la posición i . ¿Esto nunca sería posible ya que las estructuras no pueden tener funciones o aún existe alguna manera de implementar este comportamiento e imitar que una estructura podría tener una función (simple) que en realidad solo es la estructura que se copia a una nueva estructura y actualiza su estructura? campos, que podria hacer?

Entonces, replace podría ser un tercer miembro de la estructura que apunta a una nueva estructura que se actualiza cuando se accede a ella o similar. ¿Se podría hacer? ¿O hay algo incorporado o alguna teoría o paradigma que impida mi intención?

El fondo es que estoy escribiendo código C y me encuentro reinventando funciones que sé que son integradas en bibliotecas en lenguajes OOP y que OOP sería una buena manera de manipular cadenas y comandos.

    
pregunta Niklas Rosencrantz 25.05.2016 - 05:33

4 respuestas

21

Tu función debería tener este aspecto.

void
replace(struct string * s, int i, char c);

Esto acepta un puntero al objeto para operar como el primer parámetro. En C ++, esto se conoce como el puntero this y no necesita ser declarado explícitamente. (Contraste esto con Python donde tiene que hacerlo).

Para llamar a su función, también pasaría ese puntero explícitamente. Básicamente, usted intercambia la sintaxis o.f(…) por la sintaxis f(&o, …) . No es un gran problema.

La historia se vuelve más complicada si desea admitir polimorfismo (también conocido como virtual funciones). También se puede emular en C (lo he mostrado para esta respuesta .) Pero no es suficiente. a mano.

Como Jan Hudec ha comentado, también debería hacer un hábito prefijar el nombre de la función con el nombre del tipo (es decir, string_replace ) porque C no tiene espacios para nombres, por lo que solo puede haber una sola función llamada replace .

    
respondido por el 5gon12eder 25.05.2016 - 05:46
42

Las estructuras pueden contener la función punteros , pero en realidad solo son necesarias para los métodos virtuales. Los métodos no virtuales en C orientada a objetos generalmente se realizan pasando la estructura como el primer argumento a una función regular. Mire Gobject para ver un buen ejemplo de un marco OOP para C. Utiliza macros para manejar gran parte de la placa de preparación requerida para la herencia. y polimorfismo.

C fue creada hace 44 años. Es un lenguaje muy popular para el código abierto. No eres la primera persona en pensar que las cuerdas C estándar son torpes para trabajar. Hacer algunas búsquedas de bibliotecas de cadenas C. No tienes que reinventar la rueda.

    
respondido por el Karl Bielefeldt 25.05.2016 - 06:13
8

Con los punteros de función, puede hacer:

str.replace(&str, i, c);

Por lo general, esto solo es útil si la implementación puede cambiar, en cuyo caso deberías usar un vtable, por lo que la sobrecarga es solo un puntero por estructura:

str.vtable->replace(&str, i, c);
    
respondido por el o11c 25.05.2016 - 05:43
3

Sí, pueden, más o menos. Puede hacer uso del hecho de que C permite que los punteros funcionen en bloques en la memoria, a.k.a.un punteros a función y utilizando que puede crear una interfaz como el polimorfismo, así como funciones virtuales (incluso si no es tan bonito).

Recientemente escribí una publicación de blog sobre este tema, luego de una pregunta de uno de mis alumnos sobre el código de interfaz en C and Go, puedes leerlo aquí:

publicación de blog en interfaces que no son OO

Mira si te da alguna idea.

También puede poner una función gratuita en su código y usar un "este" puntero, lo que significa que pasa un puntero a una estructura existente para trabajar, como se describe en otras respuestas.

    
respondido por el Richard Tyregrim 25.05.2016 - 12:47

Lea otras preguntas en las etiquetas

Comentarios Recientes

<| endoftext |> El Consejo de la Ciudad de Nueva York probablemente adoptará una ley de inmigración que otorgue poder sobre las viviendas a las autoridades locales. Si avanza con la legislación este año, NYC Housing y los Monumentos La Comisión de Preservación obtendrá una forma menos costosa y más efectiva de evitar que los migrantes traficantes se establezcan en la ciudad. Tal como está, 34 lugares de la ciudad deben aceptar la nueva política de uniformes. La ley puede servir para mantener alejados a los... Lee mas