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 purplepsycho . Évalué à 2.
As tu essayé comme ça :
[^] # Re: sans les paranthèses ?
Posté par mistiru . É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 mistiru . Évalué à 3.
J'ai trouvé cette page qui à l'air d'expliquer la différence entre
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 GaMa (site web personnel) . Évalué à 9.
Il y a une ambigüité dans la syntaxe du C++.
"Pouf chien();" peut être analysé comme:
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
Matthieu Gautier|irc:starmad
[^] # Re: Constructeur sans argument
Posté par mistiru . Évalué à 2.
Merci pour cette explication claire !
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.