Yo uso C y struct
s donde una estructura puede tener miembros pero no funciones. Supongamos por simplicidad que quiero crear una estructura para las cadenas que nombre str
y quiero poder hacer str.replace(int i, char c)
dónde i
está 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 todavía hay alguna forma en que podemos 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 campos, que podría 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 impide mi intención?
El trasfondo es que estoy escribiendo código C y me encuentro reinventando funciones que sé que son bibliotecas integradas en lenguajes OOP y que OOP sería una buena manera de manipular cadenas y comandos.
fuente
str.replace(&str, i, c)
todos modos. C ++ automatiza el paso delthis
puntero, por supuesto.Respuestas:
Su función debería verse así.
Esto acepta un puntero al objeto para operar como primer parámetro. En C ++, esto se conoce como el
this
puntero y no necesita declararse explícitamente. (Compare esto con Python donde tiene que hacerlo).Para llamar a su función, también debe pasar ese puntero explícitamente. Básicamente, intercambias la
o.f(…)
sintaxis por laf(&o, …)
sintaxis. No es un gran trato.La historia se vuelve más complicada si quieres apoyar el polimorfismo (también conocido como
virtual
funciones). También se puede emular en C (lo he mostrado para esta respuesta ), pero no es bonito hacerlo a mano.Como ha comentado Jan Hudec , también debe acostumbrarse a prefijar el nombre de la función con el nombre del tipo (es decir
string_replace
) porque C no tiene espacios de nombres, por lo que solo puede haber una sola función nombradareplace
.fuente
string_replace
, porque C tampoco tiene una sobrecarga de funciones y es probable que tenga otrareplace
para otro tipo ...string_replace
. Los nombres que comienzan constr
,mem
owcs
seguidos de una letra minúscula están reservados para futuras extensiones.Las estructuras pueden mantener la función punteros de , pero en realidad solo se necesitan para métodos virtuales. Los métodos no virtuales en C orientado a objetos generalmente se realizan pasando la estructura como primer argumento a una función regular. Mire Gobject para un buen ejemplo de un marco de OOP para C. Utiliza macros para manejar una gran cantidad de repeticiones necesarias para la herencia y el polimorfismo.
C fue creado hace 44 años. Es un lenguaje muy popular para el código abierto. No eres la primera persona en pensar que las cadenas C estándar son torpes para trabajar. Realice algunas búsquedas de bibliotecas de cadenas C. No tienes que reinventar la rueda.
fuente
Con punteros de función, puede hacer:
Esto generalmente solo es útil si la implementación puede cambiar, en cuyo caso debe usar una tabla v para que la sobrecarga sea solo un puntero por estructura:
fuente
str
(omem
owcs
) y una letra minúscula están reservados por el estándar de C para futuras ampliaciones, así que no lo llamanstring_replace
.str_replace
está bien.Sí, pueden, más o menos. Puede hacer uso del hecho de que C permite que los punteros funcionen en bloques en la memoria, también conocidos como punteros de función, y usando eso puede crear una interfaz como polimorfismo y funciones virtuales (incluso si no es tan bonito).
Escribí una publicación de blog sobre este tema, siguiendo una pregunta de uno de mis estudiantes, recientemente, relativa al código similar a la interfaz en C and Go, puede leerlo aquí:
Publicación de blog en interfaces que no son OO
A ver si te da alguna idea.
También podría simplemente poner una función libre en su código y usar un puntero "this", lo que significa que pasa un puntero a una estructura existente para trabajar, como se describe en otras respuestas.
fuente