programar - programacion orientada a objetos c++ youtube
¿Luchando con C procedente de tierra orientada a objetos? (10)
Cuando me presentan problemas de programación, naturalmente empiezo a dividirlos en objetos lógicos en mi cabeza. Quién tiene qué responsabilidad, quién posee qué, quién deriva de qué, etc.
Estoy luchando con C. Simplemente no entiendo cómo hacer las cosas en un lenguaje de procedimiento.
¿Puede un programador de C con experiencia ayudar a explicar cómo debo pensar en mis programas durante el tiempo de diseño?
Por ejemplo, quiero escribir mi propia clase de semáforo. Naturalmente, necesitaría una estructura de datos de cola para mi programa, que también me gustaría escribir. Si tuviera que hacer esto en Java o C #, simplemente podría crear una clase de Cola rápida y crear una nueva instancia de ella en mi clase de Semáforo.
Pero en C, no hay objetos. Entonces, ¿tengo que incluir todo el comportamiento de mi estructura de datos de cola?
¿Puede alguien ayudarme a "conseguirlo"?
Relacionado : ¿cuál es la mejor manera de planificar y organizar el desarrollo de una aplicación en c
Pero en C, no hay objetos. Entonces, ¿tengo que incluir todo el comportamiento de mi estructura de datos de cola?
No.
Hacer esto.
Define tu clase, sin embargo, te sientes cómodo haciendo diseño OO.
Escribe los atributos de tu clase como una estructura en lenguaje C.
Coloque esa estructura en un archivo de encabezado, junto con todas las funciones que operan en esa estructura. Asegúrese de que
MyStruct * self
sea el primer argumento de todas estas "funciones de método".Escriba un módulo en C con todos los cuerpos de las funciones del método.
OO de los pobres en C. Funciona bien. Solo sea disciplinado acerca de poner todo en la estructura que necesita: variables de instancia pública y privada, todo.
En general, evite intentar tener variables privadas en primer lugar. No tiene todo el poder de un compilador OO, así que no se moleste con características de bajo valor como "privado" o "protegido".
Echa un vistazo a la api de Lua C. Ha sido mi luz de guía en lo que respecta al diseño de la interfaz C Cada función toma un estado Lua como un argumento principal que se convierte en tu "esto". La herencia es un poco más complicada, pero Chipmunk logra hacer un buen trabajo exponiendo funciones que toman estructuras de formas genéricas y resuelven los detalles de qué función se llama en realidad a través de un "klass". A menudo se puede explotar void * para que las funciones tomen diferentes tipos (estructuras) de la forma en que se sobrecargaría en OO. Se puede sentir un poco hackish a veces, pero funciona bien.
Originalmente, C ++ era solo un compilador que escribía código C desde las fuentes de C ++; luego fueron compilados por el compilador C nativo, enlazados, etc.
Por lo tanto, todos los métodos OOP están disponibles en C: es solo que el compilador no lo ayudará y no proporciona todas las capacidades de compilación, como plantillas, anulaciones de operadores, ocultación de datos, etc.
- La "estructura" de C ++ era (probablemente todavía lo es) equivalente a una "clase" con todos los miembros "públicos".
- Las funciones de los miembros se pueden implementar como indicadores de función en una estructura; Esto puede proporcionar encapsulación y polimorfismo. Los constructores existen en el ámbito global a menos que esté utilizando fábricas. Los destructores pueden ser funciones miembro.
- Usando funciones miembro de acceso, como getColor () , setColor () puede aliviar las diferencias internas y proporcionar cierta ocultación de datos. Si realmente quieres, puedes usar la sugerencia de Brian Bondy de esconderse con macros.
- En realidad, hay muchas bibliotecas de software libre que proporcionan contenedores estándar: tablas hash, arreglos dinámicos, listas vinculadas, etc.
Pasé un tiempo pasando del pensamiento procedimental al OO, así que siento tu dolor.
Descubrí que para aprender a crear objetos, era mejor pensar en cómo se verían las personas que llamaban. El mismo enfoque podría ayudarte, yendo hacia el otro lado. Considere cómo se vería la API de su componente. Una buena manera es estudiar las API de C existentes (utilicé las API de Java estándar como un conjunto de ejemplos de una API de OO).
Estás acostumbrado a usar un componente de cola como este:
import some.package.Queue;
Queue q = new Queue();
q.add(item);
En una api de C típica, esperarías algo más como:
#include <queue.h> // provides queue, make_queue(), queue_add(), others
queue q = make_queue(); // queue is probably a struct, or a struct*
queue_add(q,item);
Cuando te encuentres pensando en objetos, haz una transformación similar.
Puede usar punteros para funciones y similares, para crear estructuras similares a objetos en C, pero muchos miles de programadores de C se han administrado sin ellos.
¡Buena suerte!
Puedes hacer clases derivadas también con C:
Relacionado ¿Puede escribir código orientado a objetos en C?
Respaldo las sugerencias para hacer "OO del hombre pobre en C". También creo que podría beneficiarse si se toma algún tiempo para ver cómo funciona la OO de Perl. Básicamente, la OO se logra en Perl haciendo que el intérprete suministre a cada método la instancia como un primer parámetro implícito. Querrá hacer lo mismo en C, explícitamente, y usar una organización de código realmente buena, ya que el compilador no impondrá una buena encapsulación para usted.
Por cierto, puede hacer que los miembros de sus estructuras sean privados mediante el uso de punteros opacos . Me parece recordar que las recomendaciones y los estándares de programación de GNU incluían una técnica para hacerlo básicamente al anular todo * cuando se pasaba, y luego usar typedefs para nombrar cada tipo específico de puntero opaco que se suponía que se pasaba. (es decir, cada "clase")
Yo enmendaría la respuesta de S. Lott para usar un puntero opaco para realizar el ocultamiento de datos de los miembros de la estructura:
- Defina su clase como desee utilizando el diseño normal de OO.
- Las variables de miembro de su clase entran en una estructura de lenguaje C.
- En el archivo de encabezado, no desea exponer las variables miembro de su objeto (ya que serían "privadas" en un lenguaje OO). En su lugar, utilice un puntero opaco, es decir
typedef struct mystruct_s *mystruct_t; // first argument to all your methods
- Para todos los métodos que desee que sean "públicos", coloque sus firmas en su archivo .h. Los cuerpos de los métodos deben ir al archivo .c, y los métodos "privados" solo deben definirse en el archivo .c y también declararse estáticos para que sus símbolos no entren en conflicto con los símbolos definidos en otros archivos.
Las convenciones de nomenclatura inteligentes como los guiones bajos no son necesarios con este método, pero significa que todas sus variables miembro serán privadas. Las funciones pueden ser públicas o privadas, aunque son funciones públicas de un espacio de nombres global, por lo que es posible que desee calificar sus nombres con un nombre de "paquete" como mystruct_push()
, mystruct_pop()
, etc.
También debe dejar en claro si la persona que llama o la biblioteca es responsable de llamar a malloc()
y free()
. Lo más probable es que tengas los mystruct_t *create()
y void destroy(mystruct_t *target)
.
use glib, biblioteca c con oop http://library.gnome.org/devel/glib/2.20/
Todavía se puede pensar orientado a objetos con C.
Solo necesita crear una estructura y un conjunto de funciones que lleven un puntero a una instancia de esa estructura como su primer parámetro.
En cuanto al polimorfismo, puedes pasar el tamaño de la estructura como el primer miembro de la estructura, para que sepas cómo lanzarla.
Hay un gran pdf de programación orientada a objetos con ANSI-C aquí .