Classe en C (pas C ++)

J’ai découvert ce piratage sur un site Web en espagnol ( http://trucosinformaticos.wordpress.com/2010/12/12/programacion-orientado-a-objectos-en-c/ ).

Je veux créer une “classe” en C (pas C ++), mais lors de la compilation, j’obtiens les erreurs suivantes:

source.c(25): warning C4047: 'function' : 'Car' differs in levels of indirection from 'Car *' source.c(25): warning C4024: 'changeYears' : different types for formal and actual parameter 1 

Ceci est mon code:

 #include  typedef struct Car* Car; // class Car // { struct Car { int years; //char model[100]; }; void changeYears(Car this, int years) { this->years = years; } // } int main(void) { Car my_cars[10]; //nombrar(mis_alumnos[0], "Pepito"); changeYears(&my_cars[0], 6); // My car has now 6 years return 0; } 

Je suis d’accord avec @Oli Charlesworth pour dire que cacher un pointeur derrière une typedef est un moyen très facile de confondre vous-même et les autres.

Cependant, pour que votre code soit compilé et fonctionne, vous pouvez simplement supprimer l’opérateur & devant my_cars . Vous devez également allouer de la mémoire pour ces pointeurs. Je dirais que la première raison pour laquelle vous avez commis cette erreur est que vous vous êtes confondu avec le pointeur qui se cache.

 #include  typedef struct Car* Car; struct Car { int years; //char model[100]; }; void changeYears(Car this, int years) { this->years = years; } int main(void) { // An array of struct char* Car my_cars[10]; int i; for (i = 0; i < 10; i++) my_cars[i] = malloc(sizeof(struct Car)); changeYears(my_cars[0], 6); // My car has now 6 years return 0; } 

Voici un moyen plus raisonnable de mettre en œuvre cela sans cacher les indicateurs.

 #include  typedef struct { int years; //char model[100]; } Car; void changeYears(Car* this, int years) { this->years = years; } int main(void) { Car my_cars[10]; changeYears(&my_cars[0], 6); // My car has now 6 years return 0; } 

Je pense que c’est ce que vous recherchez:

(Une implémentation beaucoup plus propre, de ce que vous voulez)

CODE:

 #include  #include  #include  typedef struct { int years; } Car; void changeYears(Car *this, int years) { this->years = years; } int main(void) { Car *car = malloc(sizeof(Car)); changeYears(car, 2014); printf("car.years = %d\n", car->years); free(car); return 0; } 

SORTIE:

 car.year = 2014