Forum Programmation.c++ [RESOLU] Constructeur par défaut et méthodes de classe

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
18
juil.
2013

Bonjour,

Je viens de tomber sur quelque chose qui m'intrigue.
J'ai le code suivant :

// fichier main.cpp

#include <iostream>
#include "pouf.h"

int main()
{
    Pouf chien();
    int nb = chien.getTaille();
    std::cout << nb << std::endl;

    return 0;
}
// fichier pouf.h

#ifndef POUF_H_INCLUDED
#define POUF_H_INCLUDED

class Pouf
{
    public:
        Pouf();
        int getTaille();

    protected:
        int m_taille;
};

#endif // POUF_H_INCLUDED
// fichier pouf.cpp

#include "pouf.h"

Pouf::Pouf()
{
    m_taille = 0;
}

int Pouf::getTaille()
{
    return m_taille;
}

Et g++ me renvoie l'erreur :

error: request for member 'getTaille' in 'chien', which is non-class type 'Pouf()'

Si j'ai bien compris, le compilateur me dit que chien n'est pas un Pouf, et que donc il ne peut pas utiliser la méthode getTaille dessus, je me trompe ?

Ce qui est étonnant, c'est que, si je remplace :
* dans pouf.h : Pouf(); par : Pouf(int taille);
* dans pouf.cpp : Pouf::Pouf() par : Pouf::Pouf(int taille)
* dans main.cpp : Pouf chien(); par : Pouf chien(8);
Le compilateur ne me râle plus dessus… :?

HELP PLEASE !!! :D

  • # sans les paranthèses ?

    Posté par  . Évalué à 2.

    As tu essayé comme ça :

            Pouf chien;
    
    • [^] # Re: sans les paranthèses ?

      Posté par  . Évalué à 0.

      Eh bien sans les parenthèses, ça fonctionne. Merci !
      Mais alors je ne comprend pas…
      Quand je ne met pas de parenthèses, je déclare un objet de type Pouf et donc cela appelle le constructeur par défaut pour initialiser les attributs.
      Pourquoi cela ne fait il pas la même chose avec les parenthèses ?
      Pourquoi Pouf chien; et Pouf chien(); ne sont pas équivalents ?
      Pourquoi Pouf chien(8) appelle un constructeur alors que Pouf chien() n'a pas l'air d'en appeller, enfin, je ne comprend pas tout la --'

    • [^] # Re: sans les paranthèses ?

      Posté par  . Évalué à 3.

      J'ai trouvé cette page qui à l'air d'expliquer la différence entre

      Pouf chien()
      //et
      Pouf chien

      dans la partie 'Y a-t-il une différence quelconque entre MaClasse x; et MaClasse x(); ?'
      Mais je ne comprend pas bien… :(

  • # Constructeur sans argument

    Posté par  (site web personnel) . Évalué à 9.

    Il y a une ambigüité dans la syntaxe du C++.

    "Pouf chien();" peut être analysé comme:

    • La définition du chien de type Pouf n'utilisant aucun argument.
    • La déclaration d'une fonction chien qui retourne un objet de type Pouf.

    La norme définie donc que l’ambigüité soit toujours résolue en prenant la deuxième solution.

    Ne pas utiliser de parenthèse dans ce contexte (pas d'argument) permet de lever l’ambigüité.

    Il faut donc mettre

    Pouf chien;
    

    Matthieu Gautier|irc:starmad

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.