IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Fonctions POO en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Par défaut Fonctions POO en C
    Bonjour a vous tous, je voulais savoir si on pouvait faire autrement que envoyer la structure a la fonction, Je m'explique, ma structure contient une fonction qui s'apelle afficher(en pointeur bien sûr) et une variable, mais pour afficher, je suis obliger d'envoyer ma structure, je voudrais qu'on est pas besoin de le faire, en passant par une variable globale par exemple?

    Est ce possible, j'aimerais une réponse merci

    Cordialement

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Un exemple nous aiderait à comprendre mieux je pense.

    Sinon, on peut tout à fait faire de la POO en C sans exposer les structures utilisées (on parle de pointeur opaque). Le meilleur exemple de ceci est la manipulation de fichier (FILE, fopen, fclose...)

    Exemple (attention, il manque les tests de retour des fonctions et la vérification des paramètres):
    Déclaration
    Code objet.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct mon_objet_secret *MON_OBJET;
     
    /* méthode */
    void action(MON_OBJET *objet);
    /* constructeur */
    MON_OBJET * creer(void);
    /* destructeur */
    detruire(MON_OBJET *objet);
    Définition :
    Code objet.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    struct mon_objet_secret { 
        int champ;
    };
    /* methode */
    void action(MON_OBJET *objet)
    {
        printf("champ vaut %d\n", champ);
    }
    /* constructeur */
    MON_OBJET creer(void)
    {
        mon_objet_secret *obj = malloc(sizeof *obj);
        obj->champ = 10;
        return obj;   
    }
    /* destructeur */
    detruire(MON_OBJET *objet)
    {
        free(objet);
    }

    Utilisation :
    Code main.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "objet.h"
    int main(void) {
        MON_OBJECT *obj = creer();
     
        action(obj);
     
        detruire(obj);
     
        return 0;
    }

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    214
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 214
    Par défaut
    Dans ce cas, cela revient au même au niveau de ta fonction. Que ta variable soit dans la pile ou le tas, elle reste présente.

    Mais en terme de programmation, il vaut mieux éviter les variables globales, c'est une règle que tu as déjà dû rencontrer.

    Certes cela te permet une flexibilité imbattable. Mais tu arrives vite à quelque chose d'ingérable : objet pouvant être appelé dans n'importe quel contexte, et donc toute modification fait que tu dois tester tout ton programme si tu veux t'assurer des non-régressions, toute ton appli est dépendante de ta variable globale, et si tu veux utiliser plusieurs objets identiques, tu devras alors faire preuve de ruse pour pouvoir y accéder.

    Ce n'est pas vraiment développer durable .

    Passer le pointeur de ta structure, je ne vois pas ce qu'il y a du mal à ça.

  4. #4
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Par défaut
    @ Jérome, justement, c'est pour cette ruse que là que j'ai besoin d'aide ^^.

    En fait je vais essayer de mieux expliqué mon problème ^^.
    On imagine ma structure integer avec la variable i dedans

    On le construit puis a la fin on le détruit

    Pour l'afficher en c ++ on fait comme ceci

    integer.affiche();
    alors que en C on doit faire integer.affiche(integer);

    C'est là, au lieu de passer mon argument, que je veux savoir comment faire pour que la fonction "appartiennent vraiment" a mon objet, vous saisissez?

    J'avais penser a faire une variable globale, mais ça ne fonctionne que pour un seul objet, ça aurait éte trop facile sinon ^^

    Cordialement Qnope

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Impossible en C, le C n'est pas orienté objet, tu n'as donc pas le choix de spécifier un pointeur vers ta structure en argument à tes fonctions.
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2006
    Messages
    209
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 209
    Par défaut
    Je crois que je viens de trouver avec un tableau de globale, je sais que certains d'entre vous c'est le mal, mais vive le static ^^

    Merci quand même d'avoir essayer de m'aider

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par qnop Voir le message
    Je crois que je viens de trouver avec un tableau de globale, je sais que certains d'entre vous c'est le mal, mais vive le static ^^
    Effectivement, c'est une pratique qui serait bon de bannir, pour moi et voir d'autres, cela ne devrait même pas être autorisé par le compilateur
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 474
    Par défaut
    Citation Envoyé par qnop Voir le message
    Je crois que je viens de trouver avec un tableau de globale, je sais que certains d'entre vous c'est le mal, mais vive le static ^^
    Voici quelques arguments pour te dissuader d'y recourir si ce n'est pas nécessaire :

    http://www.developpez.net/forums/d93...c/#post5271611

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par qnop Voir le message
    Je crois que je viens de trouver avec un tableau de globale, je sais que certains d'entre vous c'est le mal, mais vive le static ^^
    Même en passant sur les problèmes liés à l'utilisation de variables globales, je ne vois pas trop en quoi ça résout ton problème. Il faudra bien passer l'index à utiliser à ta fonction, je ne vois pas où est le gain par rapport à passer un pointeur sur la structure adéquate.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 831
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 831
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par qnop Voir le message
    Citation Envoyé par Franck.H Voir le message
    Impossible en C, le C n'est pas orienté objet, tu n'as donc pas le choix de spécifier un pointeur vers ta structure en argument à tes fonctions.
    Hélas oui. et ça va même plus loin dans les contraintes.
    Si tu définis deux objets distincts, style "carre" et "rond", tu auras peut-être besoin de les afficher. Tu voudrais alors créer une fonction "affiche" qui servira à afficher le carré mais pour afficher le rond, tu ne pourras pas appeler la fonction "affiche" aussi. Tu seras obligé de trouver deux noms bien distincts pour tes fonctions, style "affiche_carre" et "affiche_rond".

    Bon, on s'y fait bien sûr. Mais quand on a goûté à l'objet, c'est dur de revenir au C...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Si tu définis deux objets distincts, style "carre" et "rond", tu auras peut-être besoin de les afficher. Tu voudrais alors créer une fonction "affiche" qui servira à afficher le carré mais pour afficher le rond, tu ne pourras pas appeler la fonction "affiche" aussi. Tu seras obligé de trouver deux noms bien distincts pour tes fonctions, style "affiche_carre" et "affiche_rond".
    Certes l'objet est moins évident en C, mais on peut quand même faire des choses biens, par exemple GTK+. (voir http://nicolasj.developpez.com/gobject/classe/)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [PHP 5.0] optimisation fonctions POO
    Par domega dans le forum Langage
    Réponses: 2
    Dernier message: 07/10/2009, 13h15
  2. Réponses: 3
    Dernier message: 06/11/2005, 18h02
  3. [POO] passage nom objet dsn les parametres d'une fonction
    Par melou dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 21/10/2005, 17h26
  4. [POO] fonction toUpperCase : Objet attendu
    Par LineLe dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 19/04/2005, 16h51
  5. [POO] Formulaire HTML + fonction JS = Erreur
    Par bdaboah dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/11/2004, 21h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo