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 :

mauvaise creation d'objet


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    112
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Août 2007
    Messages : 112
    Par défaut mauvaise creation d'objet
    salutation à tous je suis super novice en C++ et apparament y'a un truc qui cloche au niveau de la création de l'objet mm
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <string>
    #include <iostream>
    class MM
    {
        public:
          int som1;
          int n1;     
    
        MM::MM(){
        som1=0;
        n1=0;
        }
        double fact(int n)
    {
         if (n > 0) return n*fact(n-1);
         else return 1;
    }
    int puiss (int x,int n2)
    {
        if (n2>0) return x*puiss(x,n2-1);
        else return 1;
    }
    };
       int main()
    {
       
       MM mm();
        int b,c,y,a,i;
        int tab[100];
       printf("donner la valeur de a\n ");
       scanf("%i",&a);
       printf("donner la valeur de b\n");
       scanf("%i",&b);
       printf("donner la valeur de c\n");
       scanf("%i",&c);
       y=a/b;
       for (n1=0 ; n1<s ; i++){
       tab[i]=mm.puiss(y,n);
       
       
        system("PAUSE");
        
        return EXIT_SUCCESS;
    }
    ce qui est marqué en gras c'est la partie qui pose probléme ...
    merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET/C/C++
    Inscrit en
    Septembre 2007
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET/C/C++
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2007
    Messages : 71
    Par défaut
    Citation Envoyé par onlytime Voir le message
    salutation à tous je suis super novice en C++ et apparament y'a un truc qui cloche au niveau de la création de l'objet mm
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <string>
    #include <iostream>
    class MM
    {
        public:
          int som1;
          int n1;     
    
        MM::MM(){
        som1=0;
        n1=0;
        }
        double fact(int n)
    {
         if (n > 0) return n*fact(n-1);
         else return 1;
    }
    int puiss (int x,int n2)
    {
        if (n2>0) return x*puiss(x,n2-1);
        else return 1;
    }
    };
       int main()
    {
       
       MM mm();
        int b,c,y,a,i;
        int tab[100];
       printf("donner la valeur de a\n ");
       scanf("%i",&a);
       printf("donner la valeur de b\n");
       scanf("%i",&b);
       printf("donner la valeur de c\n");
       scanf("%i",&c);
       y=a/b;
       for (n1=0 ; n1<s ; i++){
       tab[i]=mm.puiss(y,n);
       
       
        system("PAUSE");
        
        return EXIT_SUCCESS;
    }
    ce qui est marqué en gras c'est la partie qui pose probléme ...
    merci
    Première chode, ton constructeur de être déclaré con suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MM(){
        som1=0;
        n1=0;
        }
    La syntaxe MM::MM() ne vaut que lorsque que tu déclare le constructeur en dehors de celle-ci.
    Ensuite, pour instancier un objet, il faut faire:
    sans parenthès.
    Enfin, pour ta boucle, je ne comprends pas ce que tu veux faire
    - d'ou viens ce n1???
    - d'ou viens le n que tu utilise juste après???

    En esperant que ça aide

  3. #3
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    ça n'a pas de rapport avec le problème, mais juste pour compléter : en C++ on utilisera plutot :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       std::cout << "Donnez la valeur de a" << std::endl;
       std::cin >> a;
    à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       printf("donner la valeur de a\n ");
       scanf("%i",&a);

  4. #4
    Invité
    Invité(e)
    Par défaut
    Hello Onlytime,

    Pour t'aider à comprendre ce qui ne va pas, regarde à nouveau ta ligne MM mm(); - elle ressemble comme deux gouttes d'eau à une déclaration de fonction. En écrivant cela, tu déclares effectivement une fonction qui s'appelle "mm", qui ne prend pas de paramètre, et qui renvoie un objet de type "MM". Relis le message d'erreur du compilateur, qui devrait te sembler plus clair maintenant.

    Donc pour construire un objet avec le constructeur sans paramètre, ne pas mettre de parenthèses.

    Cheers,

    Carl

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Pour faire court: oui.
    Ce n'est pas évident pour un débutant de comprendre l'utilité de cette nouvelle syntaxe un peu déconcertante, on se sent souvent mieux avec son bon vieux printf. Mais les streams apportent des avantages non négligeables.
    D'ailleurs, de manière générale, il est fortement déconseillé d'utiliser des fonctions C depuis du C++ tant que tu n'as pas quelques années d'expérience. Mélanger les deux sans prendre moulte précautions peut facilement rendre les programmes instables pour des raisons que tu n'imagines même pas au début. Le meilleur réflexe du débutant (et que très peu ont) est de systématiquement chercher une biblio pure C++ dés que tu veux faire quelque chose, même si tu connais une fonction C qui saurait le faire.

  6. #6
    Membre confirmé
    Inscrit en
    Janvier 2008
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 38
    Par défaut
    Alors c'est résolu ?

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Citation Envoyé par bountykiler Voir le message
    Première chode, ton constructeur de être déclaré con suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MM(){
        som1=0;
        n1=0;
        }
    En fait il devrait même utiliser la liste d'initialisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MM()
      : som1( 0 )
      , n1( 0 )
    {}
    MAT.

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Il devrait pour plein de raisons.
    Mais il débute, alors bon pour le moment , ne pas utiliser la liste d'initialisation pour 2 entiers ce n'est pas vraiment grave.

    Quand il sera plus expérimenté, il comprendra pourquoi il faut mieux l' utiliser, pour 2 entiers.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Quand il sera plus expérimenté,il comprendra pourquoi il faut mieux utiliser la liste d'initialisation,même pour 2 entiers.
    Salut,
    je ne suis pas un expert mais ça m'intéresse, c'est optimisé de le mettre dans la liste d'initialisation?

    coyotte507

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Par défaut
    Pour deux entiers non, ou alors seulement en mode debug.
    Pour des classes oui. Cela s'explique par le fait que quand tu n'utilises pas la liste d'initialisation c'est d'abord le constructeur par défaut qui est appelé. Par exemple pour un std::string, c'est plus rapide de lui passer un const char* dans le constructeur prévu à cet effet plutot que d'appeler son constructeur par défaut qui va initialiser une chaine vide puis son opérateur d'affectation prenant un const char* (un seul new dans le premier cas, deux dans le second pour le même résultat).
    Bien entendu, certaines classes ne possèdent pas de constructeur par défaut, dans ce cas il est alors indispensable d'utiliser la liste d'initialisation sous peine que ça ne compile jamais.

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

Discussions similaires

  1. Creation d'objet a partir d'un fichier - espace de nom -
    Par LLEJEUNE1 dans le forum Général Python
    Réponses: 2
    Dernier message: 05/04/2006, 12h13
  2. probleme de creation d'objet cristal report
    Par sam_12_3 dans le forum SAP Crystal Reports
    Réponses: 8
    Dernier message: 03/04/2006, 13h58
  3. creation d'objet de classe a partir de string
    Par mencaglia dans le forum C++
    Réponses: 1
    Dernier message: 14/03/2006, 09h56
  4. [debutant] Creation d'objet au fur et a mesure
    Par jamesleouf dans le forum Débuter
    Réponses: 8
    Dernier message: 14/03/2006, 00h06
  5. Lancer des shell unix pour creation d'objet ORACLE
    Par sygale dans le forum Administration
    Réponses: 6
    Dernier message: 27/10/2004, 18h03

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