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 :

conversion en classe incomlete impossible


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Inscrit en
    Février 2011
    Messages
    188
    Détails du profil
    Informations forums :
    Inscription : Février 2011
    Messages : 188
    Par défaut conversion en classe incomlete impossible
    Bonjour,

    J'ai une structure struct dans la classe C.
    C.H
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct structure
    {
    Graphe g; //Graphe est une classe
    float cout;
    };
    Dans C.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include C.H;
    struct structure;
     
    struct structure* fct(Graphe g)
    {
    struct structure *s=new structure();
    /*.................*/
    return s;
     
    }
    et j'ai une fonction fct qui retourne un pointeur sur cette structure.

    En compilant plusieurs s'affiche :
    error C2556 : la fonction surchargée ne diffère que par le type de retour de
    et

    error C2371: 'fct'*: redéfinition*; types de base différents
    Et dans C.cpp le message suivant s'affiche en cliquant sur return s :

    conversion en classe incomlete "structure" impossible
    Merci.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Attention, dans C.cpp, à la ligne 1, c'est soit #include <C.H> soit #include "C.H" qu'il faut écrire.

    Erreur de typo ou de copie (en outre, il est surprenant qu'un fichier d'en-tête nommé C.H contienne une structure nommée... structure , tu devrais essayer de nommer tes fichiers de manière cohérente avec leur contenu )

    Toujours dans le fichier C.cpp, à la ligne 2, la déclaration anticipée de structure n'est pas nécessaire : l'inclusion du fichier d'en-tête donne l'assurance que le compilateur connaitra toute la structure dans C.cpp

    Linges 4 et 6 de c.cpp : contrairement à C, il n'est pas nécessaire de rajouter struct à chaque fois que tu veux utiliser structure : En C++, le compilateur sait parfaitement que structure correspond à un type

    La ligne 6 de c.cpp ne fait pas du tout ce que tu crois : elle appelle la fonction structure(), qui est différente du constructeur par défaut de ta structure l'appel correct est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    structure *s = new structure;
    De manière générale, évite au maximum l'utilisation des pointeurs et de l'allocation dynamique si tu n'en a pas besoin.

    Dans le cas présent, tu n'a pas forcément besoin de l'allocation dynamique, tu pourrais donc renvoyer un objet de type structure sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    structure fct(Graphe g){
        structure s;
        s.g=g;
        return g;
    }
    Ceci dit, peut etre serait il intéressant, en vrac:
    1. de transmettre le graphe sous la forme d'une référence constante à fct de manière à éviter les copies inutiles
    2. de déclarer et de définir un constructeur prenant une référence constante sur Graphe (et un float) pour structure
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Hello,

    J'ajouterai que l'utilisation de "cout" pour le nom du membre n'est pas des plus judicieuse. Si jamais, dans ton .cpp, tu ajoutes tu risques d'avoir des surprises...

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    non, je ne pense pas parce que la recherche de nom se fait d'abord parmi les membres quand on est dans une fonction membre.

    et en dehors, ce sera machin.cout...

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 176
    Par défaut
    Et que se passe-t-il si dans une fonction membre on veut afficher cout ?
    Peut être que ça marche, j'ai pas fait l'essai, je voulais juste dire que le nom est mal choisi.

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par GeantVert13 Voir le message
    Et que se passe-t-il si dans une fonction membre on veut afficher cout ?
    Peut être que ça marche, j'ai pas fait l'essai, je voulais juste dire que le nom est mal choisi.
    ca se résout assez facilement...

    Pour pouvoir faire appel à la sortie standard, tu devras simplement utiliser son nom pleinement qualifié (malgré la directive using namespace) à cause du conflit de nom:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::cout << cout << endl;
    Ceci dit, il est, de toutes manières, préférable de fournir le flux de sortie en argument (de préférence sous la forme d'un ostream, histoire que ca marche avec n'importe quel flux):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void MaClass::maFonction(std::ostream & os){
    os<<cout<<std::endl;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Citation Envoyé par koala01 Voir le message
    La ligne 6 de c.cpp ne fait pas du tout ce que tu crois : elle appelle la fonction structure(), qui est différente du constructeur par défaut de ta structure l'appel correct est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    structure *s = new structure;
    structure * s = new structure(); est aussi valide. Cela effectue une initialisation par valeur ("value-initialize") plutôt qu'une initialisation par défaut ("default-initialize") dans la cas de structure * s = new structure;.
    J'aurais tendance à préférer la première qui commence par initialiser par zéro ("zero-initialize") en l'absence de constructeur fournis par l’utilisateur ... enfin censé initialiser car VS 2012 express ne semble pas connaître cette règle .

Discussions similaires

  1. message :conversion double from struct impossible
    Par oliv27400 dans le forum Images
    Réponses: 0
    Dernier message: 02/07/2010, 09h42
  2. ajout de conversion à des classes figées
    Par stardeath dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2009, 17h41
  3. utiliser une methode d'une classe (acces impossible)!
    Par Javamar dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 12/02/2009, 14h48
  4. [A-03] Conversion mdb vers mde impossible
    Par bigounet dans le forum Access
    Réponses: 4
    Dernier message: 01/11/2008, 23h09
  5. Conversion de classe Date vers classe Calendar
    Par Bateau_Ivre dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 21/07/2008, 11h46

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