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 :

Erreur d'une fonction simple qui retourn un Vector


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut Erreur d'une fonction simple qui retourn un Vector
    Bonjour,

    J'ai fait un programme hyper simple pour voir comment une fonction retourne un vecteur ,
    voici l'exemple :

    Main
    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
     
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <vector>
    #include "Essaye.h"
    using namespace std;
     
     
    int main()
    {
    	Essaye Etud;
     
    	Etud.MaFonction("Jean","Jack");
     
        return 0;
    }
    Classe "Essaye.h"
    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
    #include <vector>
    #include <string.h>
    #include <iostream>
    using namespace std;
     
     
    #ifndef ESSAYE_H_
    #define ESSAYE_H_
     
    class Essaye {
     
    public: struct etudiant {string nom;string prenom;};
     
    public:
    	Essaye();
    	vector<etudiant> MaFonction(string,string);
     
     
    private :
    string monNom;
    string monPrenom;
     
    };
    #endif /* ESSAYE_H_ */
    et le fichier "Essaye.cpp"
    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
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <vector>
    #include "Essaye.h"
    using namespace std;
     
    Essaye::Essaye()
    {
    	monNom="nom1";
    	monPrenom="prenom1";
    }
     
    vector<etudiant> Essaye::MaFontion(string nom,string prenom)
    {
    	etudiant etud;
    	vector<etudiant> vect;
     
    	etud.nom = nom;
    	etud.prenom = prenom;
     
    	vect.push_back(etud);
     
    	return vect;
    }
    Voici l'erreur qui m'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Essaye.cpp:18: error: ‘etudiant’ was not declared in this scope
    ../Essaye.cpp:18: error: template argument 1 is invalid
    ../Essaye.cpp:18: error: template argument 2 is invalid
    ../Essaye.cpp:18: error: no ‘int Essaye::MaFontion(std::string, std::string)’ member function declared in class ‘Essaye’
    make: *** [Essaye.o] Error 1

    Pourquoi cette erreur s'il vous plait ?

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Points : 311
    Points
    311
    Par défaut
    En plus de ton erreur de compilation, ton programme ne peux pas marcher. En effet, tu déclares une variable locale dans ta fonction qui doit retourner un vector. Cette variable sera détruite à la sortie de ta fonction et donc tu ne peux rien récupérer.
    Tu dois créer un pointeur sur un vector.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    vector<etudiant> Essaye::MaFontion(string nom,string prenom)
    {
    	etudiant etud;
    	vector<etudiant> *vect = new vector<etudiant>();
     
    	etud.nom = nom;
    	etud.prenom = prenom;
     
    	vect->push_back(etud);
     
    	return *vect;
    }
    Dans ton fichier .cpp il est inutile de remettre les includes de string et vector car ils sont déjà dans le .h de même le using namespace std est déjà dans le .h.
    Tu dois te méfier des déclarations double de using namespace std car elles ce cumulent ce qui peux donner des choses assez étranges.

    Concernant ton problème de compilation, je dirais que tu déclares cette structure uniquement dans la classe il faudrait qu'elle soit définie en dehors de la classe pour qu'elle soit connue du compilateur.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    158
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 158
    Points : 72
    Points
    72
    Par défaut
    Merci pour votre réponse ,

    Citation Envoyé par andnicam Voir le message
    Concernant ton problème de compilation, je dirais que tu déclares cette structure uniquement dans la classe il faudrait qu'elle soit définie en dehors de la classe pour qu'elle soit connue du compilateur.
    Je dois la définir ou a part dans la classe ?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par mimish Voir le message
    Merci pour votre réponse ,



    Je dois la définir ou a part dans la classe ?
    Tu définis ta structure à l’extérieur de la classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    struct etudiant{
    [...]
    };
     
    class Essaye {
    [...]
    };
    comme mentionné par andnicam , c'est la source de ton erreur de compil.

  5. #5
    screetch
    Invité(e)
    Par défaut
    tu n'es pas obligé de le sortir de la classe, tu peux plutot faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<Essaye::etudiant> Essaye::MaFontion(string nom,string prenom)

    l'idée du pointeur est aussi très mauvaise, ton premier code marchait tres bien. La méthode va retourner une copie de ta variable locale avant de détruire la variable locale. La méthode de andnicam crée juste un leak mémoire :-/

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    80
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Territoire de Belfort (Franche Comté)

    Informations forums :
    Inscription : Mars 2006
    Messages : 80
    Points : 77
    Points
    77
    Par défaut
    C'est pas faux pour la fuite mémoire et aussi pour l'accès à ta structure, ça t'évite de modifier le code avec la dernière solution

Discussions similaires

  1. [XL-2003] erreur dans une fonction appelée dans excel et qui ecrit dans excel
    Par peeter__steewart dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 10/08/2009, 15h00
  2. [Dates] Fonction php qui retourne le mois dans une date
    Par super-java dans le forum Langage
    Réponses: 3
    Dernier message: 17/04/2008, 18h24
  3. Une Fonction SQL qui retourne le résultat d'une requête
    Par kamacho25 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/09/2007, 10h44
  4. [VBA][03] Erreur dans une fonction qui vide des tables
    Par NiKoTiNe dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/04/2007, 14h13
  5. Réponses: 15
    Dernier message: 22/03/2007, 02h35

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