Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - é possibile programmare a oggetti in c ?
Forum - C/C++ - é possibile programmare a oggetti in c ?

Avatar
c_programmer (Normal User)
Newbie


Messaggi: 14
Iscritto: 27/12/2009

Segnala al moderatore
Postato alle 14:54
Venerdì, 01/01/2010
così, domanda secca; forse mi riterrete stupido per avervela posta !

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 15:02
Venerdì, 01/01/2010
Nessuna domanda è stupida. La risposta è no. Se vuoi programmare a oggetti utilizza il C++

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 15:29
Venerdì, 01/01/2010
La domanda è molto astuta invece... la risposta, lasciatemi fare il bastian contrario, è SI!

Il linguaggio non supporta nativamente gli oggetti, ma puoi usare delle convenzioni per questo...

ti faccio un esempio:

Codice sorgente - presumibilmente C++

  1. // Definizione di fake-class in C
  2. // MiaClasse.h
  3.  
  4. #ifndef _MIACLASSE_H
  5. #define _MIACLASSE_H
  6.  
  7. typedef struct _MiaClasse
  8. {
  9.   int m_id;
  10.   char * m_Name;
  11.   short m_Param;
  12. } MiaClasse;
  13.  
  14. // Funzioni membro: attenzione in C non esiste il puntatore implicito all'istanza corrente (il "this" per intenderci), quindi ci occuperemo di passarlo manualmente
  15.  
  16. void MiaClasse_Init(MiaClasse *pThis, int id, char* name, short param); // Il costruttore
  17. void MiaClasse_Destroy(MiaClasse *pThis); // Il distruttore
  18. const char * MiaClasse_GetName();
  19. void MiaClasse_SetName(); // Metodi di incapsulamento
  20.  
  21. #endif



poi definiamo l'implementazione
Codice sorgente - presumibilmente C++

  1. // MiaClasse.c
  2.  
  3. #include "MiaClasse.h"
  4.  
  5. void MiaClasse_Init(MiaClasse *pThis, int id, char* name, short param)
  6. {
  7.   if (pThis == NULL)
  8.      return;
  9.  
  10.   pThis->m_id = id;
  11.   pThis->m_Name = name;
  12.   pThis->m_Param = param;
  13. }
  14.  
  15. // .... ecc....



Quando poi, in un altro punto del codice, dovrai usare questa classe, farai così:
Codice sorgente - presumibilmente C/C++

  1. // main.c
  2.  
  3. #include "MiaClasse.h"
  4.  
  5. int funzioneQualsiasi()
  6. {
  7.   MiaClasse prova; // Variabile locale
  8.  
  9.   // Chiamo il costruttore manualmente, uso & per avere l'indirizzo sullo stack
  10.   MiaClasse_Init(&prova, 1, "ciao", 0); // valori a caso
  11.  
  12.   // uso la classe
  13.   printf("chupa : %s\n", MiaClasse_GetName(&prova));
  14.  
  15.   // Chiamo il distruttore
  16.   MiaClasse_Destroy(&prova);
  17.  
  18. }



La stessa cosa vale per le allocazioni dinamiche (quelle con il "new" del C++, per intenderci).

Codice sorgente - presumibilmente C/C++

  1. // main.c
  2.  
  3. #include "MiaClasse.h"
  4.  
  5. int funzioneQualsiasi()
  6. {
  7.   MiaClasse *prova = malloc(sizeof(*prova)); // Allocazione dinamica
  8.  
  9.   // Chiamo il costruttore manualmente, "prova" è già un puntatore, non serve &
  10.   MiaClasse_Init(prova, 1, "ciao", 0); // valori a caso
  11.  
  12.   // uso la classe
  13.   printf("chupa : %s\n", MiaClasse_GetName(prova));
  14.  
  15.   // Chiamo il distruttore
  16.   MiaClasse_Destroy(prova);
  17.  
  18.   // Libero la memoria
  19.   free(prova);
  20.  
  21.  
  22. }



Usando queste convenzioni in modo accurato, puoi programmare ad oggetti in C, anche se con diverse limitazioni, ma la struttura "semantica" rimane quella dell'OOP.

Si può implementare anche il polimorfismo se vuoi, se ti interessa posso dartene un esempio...
Ciao e buono studio ;)


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 16:23
Venerdì, 01/01/2010
Si in questo modo si potrebbe aggirare il problema ma si hanno delle limitazioni che in un linguaggio che li supporta nativamente come, ad esempio, il VB.NET non ci sono.

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 16:48
Venerdì, 01/01/2010
Ovvio... ma in questo modo puoi scrivere anche programmi da 200 mila linee di codice in C su piattaforme estremamente lente (cosa che ho fatto in passato sul Nintendo DS), senza rinunciare alla comodità della struttura OOP propria di linguaggi più evoluti (e meno efficienti in termini di istruzioni macchina).


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
c_programmer (Normal User)
Newbie


Messaggi: 14
Iscritto: 27/12/2009

Segnala al moderatore
Postato alle 17:46
Venerdì, 01/01/2010
saprei come implementare il polimorfismo, ma ciò è come darsi la zappa sui piedi, come ha detto TheKaneB programmare a oggetti in c è utile soprattutto per aumentare le prestazione, ma il polimorfismo le riduce drasticamente !

ps : grazie per le risposte !:)

Ultima modifica effettuata da c_programmer il 01/01/2010 alle 17:47
PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 1:11
Sabato, 02/01/2010
potresti eventualmente usare objective-c.
E' nativo come linguaggio ed è 100% compatibile col C standard.
Ed è intrinsicamente oop.



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote