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

Langage C++ Discussion :

Différence entre Object obj(); et Object obj = Object();


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2018
    Messages : 5
    Par défaut Différence entre Object obj(); et Object obj = Object();
    Bonjour,
    J'ai été surpris par mon compilateur lorsqu'en initialisant une classe Mesh mesh();
    je reçois une erreur un peu plus loin en passant mon object en argument dans une fonction draw(Mesh& mesh),
    ou que j'essaye d'accéder à une méthode de mesh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    error C2228: left of '.attachBuffer' must have class/struct/union
    error C2664: 'void Renderer::draw(Mesh &,Program &)': cannot convert argument 1 from 'Mesh (__cdecl *)(void)' to 'Mesh &'
    Lorsque je déclare mon object comme ça : Mesh mesh; Ou que je l'initialise Mesh mesh = Mesh(), je ne reçois plus aucune erreur...
    Est-ce qu'il y a une différence entre les deux syntaxes, ou j'ai un problème plus grave que ça ? :p

  2. #2
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 766
    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 766
    Par défaut
    Il faut attendre les experts, mais en théorie, il n'y a aucune différence : c'est l'appel du constructeur par défaut.
    Tu as aussi Object obj;.


    Mais en C++, il y a une ambiguité qui s'appelle "Most vexing parse" (<- lien wiki anglais)
    En gros, lorsque tu codes Object obj(); le compilateur hésite parce qu'il voit la déclaration d'une fonction mais aussi l'appel du constructeur par défaut.

  3. #3
    Membre averti Avatar de Maghin
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Octobre 2014
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2014
    Messages : 29
    Par défaut
    En fait lorsque tu écris "Mesh mesh();" tu ne déclares pas un objet que tu pense initialiser mais en fait tu déclares une fonction sans argument qui retourne un objet du type "Mesh".

    Le point clé dans l'erreur c'est le (__cdecl *) qui est un marqueur du compilateur pour indiquer que c'est une fonction. Et donc le problème est bien là, il n'arrive pas à convertir une fonction en référence...

    Personnellement la méthode que je préfère serait en c++ 11: "auto mesh = Mesh()".

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Je rajouterai que je trouve `T o = T(whatever);` très maladroit. On dirait un développeur fraîchement débarqué en C++ sans adapter ses pratiques.

    Au choix (sans les trucs non-idiomatiques):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Version avec paramètres
    T o(whatever);
    T o{whatever}; // quand il n'y a pas de constructeur avec initializer-list qui change des choses.
    auto o = T(whatever);
    auto o = T{whatever};
     
    // Version sans paramètres
    T o;
    T o{};
    auto o = T();
    auto o = T{};
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    La plupart de ces solutions étant disponibles à partir de C++11 (qui est supporté pratiquement partout aujourd'hui).

    Au moyen-âge du C++, si on voulait déclarer un objet d'un type POD (Plain Old Data, donc sans constructeur) et l'initialiser à des valeurs nulles, alors Object obj; ne suffisait pas, et Object obj = Object(); était la seule solution disponible (puisque Object obj {}; et auto n'existaient pas encore).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. Différences entre C++ et Objective C
    Par Nyxemis dans le forum C++
    Réponses: 3
    Dernier message: 21/01/2013, 13h55
  2. Réponses: 5
    Dernier message: 13/04/2011, 16h02
  3. différence entre business object et crystal report
    Par mapmip dans le forum Approche théorique du décisionnel
    Réponses: 2
    Dernier message: 10/06/2010, 11h58
  4. programmer en object orienté en JS la différence entre deux méthodes ?
    Par nicko_73 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 03/11/2009, 13h24
  5. Réponses: 9
    Dernier message: 28/05/2008, 14h46

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