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 :

Problème pour implanter une fonction amie


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Problème pour implanter une fonction amie
    Bonjour,

    je rencontre un petit problème avec une fonction amie qui a pour but d'accéder à un attribut (vector) d'une autre classe, afin de le trier et
    d'enlever les doublons,
    pas d'erreur lors de la compilation mais le programme ne fait pas le travail, la classe Calendrier est OK, mais pas la classe Equipes
    la fonction semble inopérante: le vector (ListEquipes) qui récupère l'attribut semble vide

    Voici le code des différents fichiers, je ne comprend pas pourquoi la fonction amie est inopérante,
    merci par avance pour votre aide

    Cordialement, Khor

    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
    27
    28
    29
    //main.cpp
     
    #include "Calendrier.hpp"
    #include "Equipes.hpp"
     
    int main()
    {
        std::vector<std::string> m_Date;
        std::vector<std::string> m_Heure;
        std::vector<std::string> m_EquipDom;
        std::vector<std::string> m_ScorDom;
        std::vector<std::string> m_ScorExt;
        std::vector<std::string> m_EquipExt;
     
     
    	Calendrier calendrier(m_Date,m_Heure,m_EquipDom,m_ScorDom,m_ScorExt,m_EquipExt);
    	calendrier.ChargerFic();
        calendrier.Afficher();
     
     
        std::vector<std::string> m_ListEquipes;
        int m_NbreEquipes=0;
     
        Equipes equipes(m_ListEquipes,m_NbreEquipes);
        equipes.TrierEquipes(m_EquipDom);
     
     
    return 0;
    }
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    //Calendrier.cpp
     
    #include <sstream>
    #include <iostream>
    #include <fstream>
     
    #include "Calendrier.hpp"
    //#include "Equipes.hpp"
     
     
    Calendrier::Calendrier(std::vector<std::string> m_Date,std::vector<std::string> m_Heure,std::vector<std::string> m_EquipDom,std::vector<std::string> m_ScorDom,std::vector<std::string> m_ScorExt,std::vector<std::string> m_EquipExt)
        {
        std::vector<std::string> Date=m_Date;
        std::vector<std::string> Heure=m_Heure;
        std::vector<std::string> EquipDom=m_EquipDom;
        std::vector<std::string> ScorDom=m_ScorDom;
        std::vector<std::string> ScorExt=m_ScorExt;
        std::vector<std::string> EquipExt=m_EquipExt;
        }
     
    void Calendrier::ChargerFic()
     
    {
        char nomfichier[20];
        std::string ligne;
        const std::string lim = ";";
        std::string enreg;
     
        //std::cout << "Entrer le nom d'un fichier existant: "; Le nom sera selectionné à partir d'une boite de dialogue
        //std::cin.get (nomfichier,20);    // get c-string
        std::ifstream fichier("ANG.txt", std::ios::in);
     
    if(fichier)  // si l'ouverture a réussi
    {
        while ( std::getline( fichier, ligne ) )
        {
            for (int j=0; j<=5; j++)
            {
                int deb=0;
     
                std::size_t postn = ligne.find(lim);
                std::string newligne = ligne.substr(postn);
                enreg = ligne.substr(deb,postn);
     
                switch(j)
                {
                    case 0:
                        Date.push_back(enreg);
                        break;
                    case 1:
                        Heure.push_back(enreg);
                        break;
                    case 2:
                        EquipDom.push_back(enreg);
                        break;
                    case 3:
                        ScorDom.push_back(enreg);
                        break;
                    case 4:
                        ScorExt.push_back(enreg);
                        break;
                    case 5:
                        EquipExt.push_back(enreg);
                        break;
                }
     
                    newligne = ligne.substr(postn + 1);
                    deb = postn + 1;
                    ligne = newligne;
            }
     
        }
     
    }
    else
        std::cerr << "Impossible d'ouvrir le fichier !" << std::endl;
    }
     
    void Calendrier::Afficher()
    {
     
    for (int i=0; i < ScorExt.size(); i++)
    	{
    		std::cout << ScorExt[i] << " ";
    		std::cout << std::endl;
    	}
    }
    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
    //Equipes.cpp
     
    #include <algorithm>
    #include <iostream>
     
    #include "Equipes.hpp"
    //#include "Calendrier.hpp"
     
    Equipes::Equipes(std::vector<std::string> m_ListEquipes,int m_NbreEquipes)
    {
      std::vector<std::string> ListEquipes=m_ListEquipes;
      int NbreEquipes=m_NbreEquipes;
    }
     
    void Equipes::TrierEquipes(std::vector<std::string> EquipDom)
    {
        std::sort(EquipDom.begin(), EquipDom.end());
        std::unique_copy(EquipDom.begin(), EquipDom.end(), std::back_inserter(ListEquipes));
        int NbreEquipes=ListEquipes.size();
        //return ListEquipes;
    }
    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
    27
    28
    29
    30
    31
    32
    33
    34
    //Calendrier.hpp
     
    #ifndef CALENDRIER_H_INCLUDED
    #define CALENDRIER_H_INCLUDED
     
    #include <vector>
    #include <string>
     
    //#include "Equipes.hpp"
     
    class Equipes;
    class Calendrier
    {
    friend void TrierEquipes(std::vector<std::string> EquipDom);//si "AfficherEquipes" seul pas d'erreur mais "TrierEquipes" ne donne rien
    //friend void AfficherEquipes(std::vector<std::string> CalendEquipDom);
                                                                            //sinon:|error: invalid use of incomplete type 'class Equipes'|
     private :
        std::vector<std::string> Date;
        std::vector<std::string> Heure;
        std::vector<std::string> EquipDom;
        std::vector<std::string> ScorDom;
        std::vector<std::string> ScorExt;
        std::vector<std::string> EquipExt;
     
     public :
        Calendrier();
        Calendrier (std::vector<std::string> m_Date,std::vector<std::string> m_Heure,std::vector<std::string> m_EquipDom,std::vector<std::string> m_ScorDom,std::vector<std::string> m_ScorExt,std::vector<std::string> m_EquipExt);
        ~Calendrier() = default;
     
    	void ChargerFic();
    	void Afficher();
    };
     
    #endif  //CALENDRIER_H_INCLUDED
    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
    //Equipes.hpp
     
    #ifndef EQUIPES_H_INCLUDED
    #define EQUIPES_H_INCLUDED
     
    #include <vector>
    #include <string>
     
    //#include "Calendrier.hpp"
     
    class Calendrier;
    class Equipes
    {
    	private:
    		std::vector<std::string> ListEquipes;
    		int NbreEquipes;
     
    	public:
    		Equipes();
    		Equipes(std::vector<std::string> m_ListEquipes,int m_NbreEquipes);
    		void TrierEquipes(std::vector<std::string> EquipDom);
    		~Equipes() = default;
     
    };
     
    #endif // EQUIPES_H_INCLUDED

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Mai 2016
    Messages
    313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2016
    Messages : 313
    Points : 1 237
    Points
    1 237
    Par défaut
    TrierEquipes prend en paramètre une valeur (de type std::vector<std::string>), alors qu'il faudrait lui passer une référence si tu veux récupérer quelque chose, std::vector<std::string>&.

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Je suppute également que le constructeur Equipes est incorrect (redéclaration de ListEquipes):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Equipes::Equipes(std::vector<std::string> m_ListEquipes,int m_NbreEquipes)
    {
      std::vector<std::string> ListEquipes=m_ListEquipes;
      int NbreEquipes=m_NbreEquipes;
    }
    devrait être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Equipes::Equipes(std::vector<std::string> m_ListEquipes,int m_NbreEquipes)
    {
      ListEquipes=m_ListEquipes;
      NbreEquipes=m_NbreEquipes;
    }
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Ou mieux en utilisant la liste d'initialisation faite pour ça.
    Attention, le problème est également présent dans le constructeur de la classe Calendrier.

    Sinon habituellement ce sont les membres que l'on préfixe de « m_ » et non l'inverse.

  5. #5
    Candidat au Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Merci pour vos diverses corrections,

    après avoir apporté les corrections nécessaires (le compilateur ne m'a pas prévenu de la redondance des déclarations), débutant j'évite pour le moment les pointeurs et références,
    malgré les corrections et l'utilisation d'une référence comme suggérée par Wolin , je n'accède pas à la variable voulue, d'où quelques petites questions :
    peut-on accéder à un seul des attributs d'une classe, si oui comment le déclarer ?

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Khornaaig Voir le message
    peut-on accéder à un seul des attributs d'une classe, si oui comment le déclarer ?
    Tu veux dire que t'ignores l'opérateur . pour accéder aux variables et fonctions membres ?
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Heu, pourquoi "TrierEquipes" a besoin d'être amie de la classe Calendrier ?

  8. #8
    Candidat au Club
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Avril 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Avril 2018
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses, je pense revoir la conception de 0

    Cordialement, Khornaaig

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

Discussions similaires

  1. Problème pour lancer une fonction dans une classe
    Par Jiyuu dans le forum Général Python
    Réponses: 13
    Dernier message: 24/08/2010, 09h05
  2. Problème pour modifier une fonction
    Par condor_01 dans le forum C
    Réponses: 5
    Dernier message: 05/11/2007, 23h03
  3. Problème pour tracer une fonction créneau
    Par Erzvinh dans le forum MATLAB
    Réponses: 8
    Dernier message: 02/02/2007, 16h53
  4. Réponses: 7
    Dernier message: 10/09/2005, 16h49
  5. [DLL] problème pour appeler une fonction d'une DLL
    Par bigboomshakala dans le forum MFC
    Réponses: 34
    Dernier message: 19/07/2004, 11h30

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