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 :

appel d'une fonction d'une classe


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 353
    Points : 0
    Points
    0
    Par défaut appel d'une fonction d'une classe
    bonjour,

    1)j'écris dans un seul fichier sur www.replit.com ce petit code:
    Code : 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <string>
    #include <stdio.h>
     
     
     
     class A{
     
       public:
     
      int mama(void)
      {
        int a,t1,t2;
        printf("entrez 1er entier: ");
        scanf("%d",&t1);
        printf("entrez 2ème entier: ");
        scanf("%d",&t2);
     
     
        a=t1+t2;
        return a;
      }
    };
     
    int main() {
     
      A objet;
      objet.mama();
      return 0;
     
    }
    Pourquoi ça ne fonctionne pas?

    2)maintenant,dans le projet de replit.com,j'utilise 2 fichiers cpp

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
     
    #include <string>
    #include <stdio.h>
     
     
    int main() {
     
      A objet;
      objet.mama();
      return 0;
     
    }
    puis fichier2.cpp
    Code : 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
    21
    22
    23
    24
     
     
    #include <string>
    #include <stdio.h>
     
     
     
     class A{
     
       public:
     
      int mama(void)
      {
        int a,t1,t2;
        printf("entrez 1er entier: ");
        scanf("%d",&t1);
        printf("entrez 2ème entier: ");
        scanf("%d",&t2);
     
     
        a=t1+t2;
        return a;
      }
    };
    Est-ce que 2) est équivlent à 1) ?
    Si non,pourquoi?
    Comment corriger 2) pour obtenir l'équivalence?


    merci de votre aide

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 951
    Points
    32 951
    Billets dans le blog
    4
    Par défaut
    Cette ligne A.objet; n'a aucun sens.
    Tu connais pas la syntaxe pour créer une variable ?
    https://www.cplusplus.com/doc/tutorial/classes/
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 353
    Points : 0
    Points
    0
    Par défaut
    je repose la question corrigée

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 113
    Points : 32 951
    Points
    32 951
    Billets dans le blog
    4
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 560
    Points : 7 614
    Points
    7 614
    Par défaut
    Bonjour,

    La FAQ explique très bien comment utiliser les fichiers d'entête.
    Il est important de comprendre que pour pouvoir utiliser la classe A, le main() doit connaitre toutes les caractéristiques accessible de A, on doit donc utiliser un #include.
    Donc mettre ta classe dans un entête serait une solution. Mais tu coup ta fonction mama() se retrouve dans l'entête, ça marche mais pour des raisons de clarté et d'optimisation c'est à éviter. Il faut donc compiler 2 fichiers qui seraient "reliés" par un entête commun. Et n'utilise pas <stdio.h> et printf() c'est du C, tout comme mettre void comme paramètre, c'est toléré mais!
    entete_a.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #ifndef ENTETE_A_H_
    #define ENTETE_A_H_
     
     class A {         // la classe A est définie ici
     public:
      int  mama();     // la fonction mama() de A est déclarée ici
    };
     
    #endif
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <iostream>
    #include "entete_a.h"
     
    int  main() {
      A  objet;              // main() peut utiliser A car il l'a "vu" dans l'entête
      int  resultat = objet.mama();
      std::cout << "resultat : " << resultat << "\n";
    }
    a.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <iostream>
    #include "entete_a.h"
     
      int  A::mama() {       // la fonction mama() de A est définie ici
        int  t1, t2;
        std::cout << "entrez 1er entier: " << std::flush;
        std::cin >> t1;
        std::cout << "entrez 2ème entier: " << std::flush;
        std::cin >> t2;
     
        return  t1 + t2;
      }

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 353
    Points : 0
    Points
    0
    Par défaut
    merci dalfab

    de nouvelles petites questions se posent suite à la solution de dalfab
    3)Le 1er code de dalfab est à inclure dans un fichier d'en tête par exemple entête.h
    Est-ce bien cela?

    4)j'ai l'impression qu'on a pas le droit d'implémenter le corps de la fonction mama dans la classe A:on peut seulement la déclarer.
    Est-ce bien cela?

    5)dans le fichier a.cpp ,on définit un constructeur de la classe A.
    a)Est-ce bien cela?
    b)aurait-on pu le définir dans le fichier d'entête dans la déclaration de la classe A comme ceci:
    Code : 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
    21
    22
    23
    24
     
    #include <iostream>
     
    #ifndef ENTETE_A_H_
    #define ENTETE_A_H_
     
     
     class A {         // la classe A est définie ici
     public:
      int  mama();     // la fonction mama() de A est déclarée ici
     
     int  A::mama() {       
        int  t1, t2;
        std::cout << "entrez 1er entier: " << std::flush;
        std::cin >> t1;
        std::cout << "entrez 2ème entier: " << std::flush;
        std::cin >> t2;
     
        return  t1 + t2;
      }
     
    };
     
    #endif

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 560
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 560
    Points : 7 614
    Points
    7 614
    Par défaut
    3) oui

    4) oui et non. Tu ne dois pas définir de fonctions dans l'entête, tu ne dois y mettre que des déclarations. Mais une fonction peut être définie inline dans l'entête. Toute fonction définie dans l'objet lui-même est implicitement inline, toute fonction définie en dehors de l'objet n'est pas inline à moins d'ajouter devant le mot inline.

    5.a) non. il n'y a aucun constructeur défini ou déclaré ici.

    5.b) Essaie, et tu verras que ce que tu écris ne marche pas.
    Tu peux mettre dans l'entête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct A {         // la classe A est définie ici
      int  mama() {    // la fonction mama() de A est DEFINIE ici, et est implicitement INLINE
        ... ... ... 
      } 
    };
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct A {         // la classe A est définie ici
      int  mama();     // la fonction mama() de A est DECLAREE ici
    };
    inline int A::mama() { // la fonction est explicitement DEFINIE comme étant INLINE
       ... ... ...
    }
    Mais c'est à éviter (oublie les pour le moment). La meilleure manière de procéder et celle que je t'avais donné avec la définition de la fonction dans un fichier source.

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 353
    Points : 0
    Points
    0
    Par défaut
    Dans la définition du fichier d'entête par dalfab:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #ifndef ENTETE_A_H_
    #define ENTETE_A_H_
     
     class A {         // la classe A est définie ici
     public:
      int  mama();     // la fonction mama() de A est déclarée ici
    };
     
    #endif
    ce fichier d'entête fonctionne aussi sans les instructions commençant par #
    Quel est alors l'intérêt précis de ces instructions?

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 626
    Points : 10 542
    Points
    10 542
    Par défaut
    Citation Envoyé par tabkelm Voir le message
    Quel est alors l'intérêt précis de ces instructions?
    "include guard" :
    1. wikipedia en français (<- lien)
    2. wikipedia en anglais + complet (<- lien)

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

Discussions similaires

  1. appel d'une classe dans une fonction
    Par fraisa1985 dans le forum Général Java
    Réponses: 7
    Dernier message: 27/03/2008, 13h11
  2. [applet][Debutante] Appel a une classe externe
    Par Skydoll dans le forum Applets
    Réponses: 3
    Dernier message: 30/01/2006, 11h31
  3. Réponses: 14
    Dernier message: 04/12/2005, 09h08
  4. [PL/SQL]Appel d'une classe/méthode java
    Par marsup54 dans le forum SQL
    Réponses: 4
    Dernier message: 30/06/2004, 17h44

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