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 :

appel d'un vector créé dans une autre classe


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut appel d'un vector créé dans une autre classe
    Bonjour, j'expose mon probleme.

    Une classe me crée un vector comme suit, je n'ai mis que la partie de code utile pour la compréhension de mon pb.
    Ma map est bien remplie, (je l'ai verifie)
    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
     
    map<string, float> Maclasse::Mafonction(Configuration* cnf)
    {.....
    .....
    .....
    map<string, int> monvecteur
            if (file)
    	{
    		while(!file.fail())
     
    		{
    		  file>>nom>>valeur;
    		  monvecteur[nom]=valeur;		
    		  cout<<nom<<"-"<<valeur<<endl;
    		}
     
     
     
    	}
    	else
    	{
    		cout<<"ERROR :  can't open file";
    	}
    		return monvecteur;		
    }
    Maintenant et c'est la que j'ai un problème, je veux utiliser les valeurs de cette map pour faire des calculs mathématique. Je fais dans une autre classe(un autre .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
    
    bool Moncalcul::CalculMath(map<string, double>*& blabla)
    
    {	
    	cout<<"bonjour : "<<endl;    Jusque la ca marche
    	for (map<string, float>::iterator myiter = monvecteur->begin(); myiter!=monvecteur->end(); myiter++)
    	{
    		cout<<"nom: "<<myiter->first<<endl;
                    mon calcul = puis la formule;
    	}
    	
    	return true;
            blabla = moncalcul;
    }
    
    C'est comme si il n'arrivait pas a rentrer dans la boucle for. J'ai l'impression qu'il n'arrive pas a trouver cette map.
    Pourtant cette fois ci j'ai bien fais une instance de ma classe en créant l'objet
    dans mon main de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaClasse* truc = MaClasse
    truc->Mafonction();
    puis idem pour ma seconde classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MonCalcul* truc2 = MonCalcul
    truc2->CalculMath();
    J'ai n'ai aucun message d'erreur. Juste un plantage sur le moment en rouge
    Merci.

  2. #2
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 765
    Points
    765
    Par défaut
    Je ne vois aucun appel à "Maclasse::Moncalcul" dans le code que tu as posté, et c'est là que je pense qu'il y a une erreur.

    Par contre fait attention au code que tu poste, ça ne compilera pas là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<string, int> map
    Il manque le ";" et tu as mis "vector" au lieu de "map".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    bool Moncalcul::Moncalcul(map<string, double>*& blabla)
    float moncalcul;
    {
    J'ai mis du temps à comprendre Tu as inversé les 2 dernière lignes je suppose ?

    Ensuite, le nom de ta map passée en argument est "blabla", alors que dans le code de "Moncalcul" tu utilises "map".

    Sinon, pourquoi utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map<string, double>*& blabla
    ... comme argument de Moncalcul ? Un référence ou un pointeur aurait suffi, non ?

  3. #3
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Par contre fait attention au code que tu poste, ça ne compilera pas là
    Oui, c'est clair, c'est juste pour l'exemple.

    Tu as inversé les 2 dernière lignes je suppose ?
    Effectivement, mais tout ceci est bien fait dans mon code original. Je fais tout de même la correction ici.


    Je ne vois aucun appel à "Maclasse::Moncalcul" dans le code que tu as posté, et c'est là que je pense qu'il y a une erreur.
    J'ai écris "idem pour ma deuxième classe", donc j'ai bien circonstancie cette objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Un référence ou un pointeur aurait suffi, non ?
    Oui et non,
    En fait, je crée de cette façon un pointeur placé en référence pour ne pas a avoir de problème lors de la destruction. Par ailleurs, j'ai beaucoup de fonction et le fais de renvoyer un bool me permet de rester plus clair et de voir si tout c'est passe correctement rapidement.
    Cela dit, je peux aussi faire comme tu dis.


    Merci d'avoir pris le temps de lire mon code.

    Dans la logique tout y est...mais je suis tout de même passé a cote de qq chose .

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Salut,

    j'ai du mal a suivre ton code mais ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (map<string, float>::iterator myiter = map->begin(); myiter!=map->end(); myiter++)
    ne devrait-t'il pas se réécrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (map<string, float>::iterator myiter = blabla->begin(); myiter!=blabla->end(); myiter++)
    ?

  5. #5
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Pas tout a fait tu mais par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for (map<string, float>::iterator myiter = monvecteur->begin(); myiter!=monvecteur->end(); myiter++
    Mais dans mon vrai code cela est bien fait aussi.
    Pour donner plus de précision, je viens de créer un map dans la classe 1
    que je cherche a appeler dans la classe 2 en itérant dessus .Ce processus d'itération ne fonctionne pas.

    Cette map est crée est vit quelque part (ou pas). Je me demande tout a coup ci la map n'a pas été détruite ce qui expliquerait le pb. Mais alors Comment la recuperer?
    Tout en sachant que j'ai instancié mon nouvel objet dans le meme ce qui revient utiliser le mot static.

    Encore Merci

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    1/ Je ne suis pas convaincu de ton explication sur le pointeur et je sens une mauvaise raison.
    2/ Tu as trop simplifié. Fournis un code minimal à partir de ce que tu as fais qui compile et qui reproduit le bug.

  7. #7
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Peux tu me donner ta version sur les pointeurs... je ne suis pas tout à fait convaincu de ma réponse non plus. en revanche je sais que certaine personne font comme cela pour de raisons de propreté du code.

    Je vais refaire un code simple mais compilable exposant mon problème le plus tot possible.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Au vu de ce que tu as montré, une référence (et même const) devrait suffire.

  9. #9
    Membre éclairé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2007
    Messages
    373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 373
    Points : 765
    Points
    765
    Par défaut
    Hum, le nouveau code que tu as posté est complètement différent !

    En gros, tu as créé une std::map dans ta classe MaClasse, et tu veux l'utiliser dans la classe MonCalcul.
    Je sais pas si c'est bien clair, mais quand une classe A possède un membre X, aucune autre classe ne peux y accéder comme si c'était le sien (à moins d'utiliser de l'héritage, mais d'après ce que je vois c'est certainement pas la solution à employer ici).

    Je ne vois pas le problème sinon
    Imagine :
    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
    class MaClasse
    {
    public :
     
        void MaFonctionQuiRemplieLaMap()
        {
            // aquisition des données...
        }
     
        std::map<std::string, float>& GetMap()
        {
            return mMap;
        }
     
    private :
     
        std::map<std::string, float> mMap;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MonCalcul
    {
    public :
     
        void CalculMath(std::map<std::string, float>& donnees)
        {
            std::map<std::string, float>::iterator iter;
            for (iter = donnees->begin(); iter != donnees->end(); iter++)
            {
                // traitement des données...
            }
        }
    };
    Tu peux ensuite faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main()
    {
        MaClasse mClasse;
        mClasse.MaFonctionQuiRempliLaMap();
     
        MonCalcul mCalcul;
        mCalcul.CalculMath(mClasse.GetMap());
     
        return 0;
    }
    Note : comme on donne une référence non const sur la std::map, on peut carrément la rendre publique...

  10. #10
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Voici un code compilable qui résume bien mon problème.
    Toujours le meme probleme d'appelle de ce map dans ma class : ClassMonCalcul.cpp
    Je n'arrive pas à rentrer dans la boucle, la map n'est pour lui pas remplie, pourtant je la remplie dans ma premiere classe.
    Merci encore.

    ClassVector.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
    #ifndef _ClassVector_h
    #define _ClassVector_h
     
    #include <map>
    #include <vector>
     
    using namespace std;
     
    class ClassVector{
     
     
     
    public:
    	ClassVector();
    	virtual ~ClassVector();
    	map<string, float> ReadFromFile();
     
    };
     
     
    #endif
    ClassVector.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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    #include "ClassVector.h"
    #include <iostream>
    #include <istream>
    #include <string>
    #include <fstream>
     
    using namespace std;
     
    ClassVector::ClassVector()
    {
     
    }
    ClassVector::~ClassVector()
    {
     
    }
     
     
    map <string, float > ClassVector::ReadFromFile()
    {
    	map<string, float> Full_Vector;
        string My_String;
    	float My_Float;
     
    	//flux permettant de rentrer et lire dans mon fichier
    	ifstream file("Document.txt"); 
    		if (file)
    	{
    		while(!file.fail())
    		{
    		file>>My_String>>My_Float;
    		// remplissage de FullVector
    		Full_Vector[My_String] = My_Float; 
    		cout<<"My_String : "<<My_String<<"--"<<"My_Float : "<<My_Float<<endl;
    		}
     
    		//debug
    		/*for (map<string, float>::iterator i = Full_Vector.begin(); i!=Full_Vector.end();i++)
    		{
    			cout<<"String : "<<i->first<<"float : "<<i->second<<endl;
    		}*/
    	}
     
     
    	else 
    	{
    	cout <<"impossible d'ouvrir le fichier";	
    	}
    		return Full_Vector;
    }

    ClassMonCalcul.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
    #ifndef _ClassMonCalcul_h
    #define _ClassMonCalcul_h
    #include <map>
    #include "ClassVector.h"
     
    class ClassMonCalcul{
     
    private : 
     
    	map<string, float> Full_Vector;
     
    public :
    	ClassMonCalcul();
    	virtual ~ClassMonCalcul();
     
    	bool FormuleMonCalcul();
     
     
    };
     
     
    #endif

    ClassMonCalcul.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
    27
    28
    #include "ClassMonCalcul.h"
    #include <Cmath>
    #include <string>
    #include <iostream>
     
     
    ClassMonCalcul::ClassMonCalcul()
    {
    	this->Full_Vector;
    }
     
    ClassMonCalcul::~ClassMonCalcul(){
     
    }
     
    bool ClassMonCalcul::FormuleMonCalcul()
    {
    	cout<<"La taille de mon vecteur est 0 donc il ne le voit pas : "<<Full_Vector.size()<<endl;
    	cout<<"Le compilateur ne rentre pas dans la boucle...";
    	for (map<string, float>::iterator myiter = Full_Vector->begin(); myiter!=Full_Vector->end(); myiter++)
    	{
    		cout<<"size"<<Full_Vector.size();
    		cout<<"test";
    		cout<<"string"<<myiter->first;
    	  //pow(Full_Vector[My_String],2);
    	}
    	return true;
    }

    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
    #include "ClassVector.h"
    #include "ClassMonCalcul.h"
    #include <istream>
    #include <string>
    #include <iostream>
     
     
     
    int main()
     
    {
    ClassVector * MyVetorObject = new ClassVector;
    MyVetorObject->ReadFromFile();
    getchar();
     
    cout<<"Classe 2";
    ClassMonCalcul* MyCalculObject = new ClassMonCalcul;
    MyCalculObject->FormuleMonCalcul();
    getchar();
    return 0;
    }

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Cette fonction renvoie une map :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map <string, float > ClassVector::ReadFromFile()
    alors que ClassMonCalcul::FormuleMonCalcul() se base sur une attribut membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class ClassMonCalcul{
    private : 
    	map<string, float> Full_Vector;
    ...
    	bool FormuleMonCalcul();
    Vu que dans ton main, ClassMonCalcul::Full_Vector n'est jamais remplie avec ClassVector::ReadFromFile(), et bien il est normal que dans ClassMonCalcul::FormuleMonCalcul(), Full_Vector soit vide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyVetorObject->ReadFromFile();
    ...
    ClassMonCalcul* MyCalculObject = new ClassMonCalcul;
    MyCalculObject->FormuleMonCalcul();

    Tu aurais pus voir ce probleme en regardant les adresses des maps entre le moment ou tu la rempli et celui ou tu essaie de la lire. Une 'technique' qui aurait pu t'eviter ce soucis consiste a preffixer ou suffixer les variables membres : m_Full_Vector ou bien Full_Vector_ par exemple.


    Par ailleurs, a quoi sert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ClassMonCalcul::ClassMonCalcul()
    {
    	this->Full_Vector;
    }
    C'est peut etre la que tu pensais initialiser la map de ClassMonCalcul.

    Je ne sais pas si ca corrigera le soucis initiale ... car tu parlais de plantage alors que la, on a plutôt un comportement non attendu.

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Quelques remarques :
    Si ton constructeur ne fait rien (ni liste d'initialisation, ni code), alors ne le définit pas. Le compilateur t'en construira un par défaut qui ira très bien, du moins tant que tu n'auras pas défini un autre constructeur avec des arguments.
    Sauf à ce que tu compte dériver tes classes, tu n'a pas à déclarer tes destructeurs en virtual. Encore que je peux comprendre pour ClassMonCalcul, je doute que pour ClassVector ça n'est un sens.
    Puisque tes destructeurs ne font rien, et dans la mesure où tu ne dérives pas la classe (cf ci-dessus), tu n'as pas besoin de les définir. Le compilateur s'en occupera très bien tout seul.

    Pourquoi ,dans le main, allouer dynamiquement sur la pile MyVetorObject et ClassMonCalcul ? Les déclarer comme locale sur le tas suffit à ton problème. En outre, tu ne gère pas correctement les cas où le new échoue.

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    En outre, tu ne gère pas correctement les cas où le new échoue.
    Ben ne rien faire et laisser le programme se terminer, ça me va.

  14. #14
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Merci de vos réponses.

    J'ai en partie résolue le problème grâce à nos discussions. J'ai réussis à récupérer ma map. Je pensais que ma map était crée et qu'elle vivair dans mon programme mais en fait il fait faire comme si c'était une variable. En créant l'instance dans le main, cela revient à faire l
    En fait il fallait faire ca en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool ClassMonCalcul::FormuleMonCalcul(ClassVector* Vect)
    {   
    		cout<<"La taille de mon vecteur est 5 donc il le voit bien : "<<Vect->ReadFromFile().size()<<endl<<endl;
    		getchar();
    		cout<<"---------------------Test-------------------------"<<endl;
    		
    		map<string, float>::iterator iter = Vect->ReadFromFile().begin();
    		cout<<"test"<<Vect->ReadFromFile().begin()->first.c_str()<<endl;
    		cout<<"test"<<Vect->ReadFromFile().begin()->second<<endl;

    Si ton constructeur ne fait rien (ni liste d'initialisation, ni code), alors ne le définit pas. Le compilateur t'en construira un par défaut qui ira très bien, du moins tant que tu n'auras pas défini un autre constructeur avec des arguments.
    Entendu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sauf à ce que tu compte dériver tes classes, tu n'a pas à déclarer tes destructeurs en virtual
    Je fais dans le vrai code l'héritage, mais pour cet exemple il est vrai que c'est inutile.

  15. #15
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Merci de vos réponses.

    J'ai en partie résolue le problème grâce à nos discussions. J'ai réussis à récupérer ma map. Je pensais que ma map était crée et qu'elle vivait dans mon programme mais pas seulement.
    En fait il fallait faire ca en plus, ce qui parait logique maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool ClassMonCalcul::FormuleMonCalcul(ClassVector* Vect)
    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
    bool ClassMonCalcul::FormuleMonCalcul(ClassVector* Vect)
    {   
    		cout<<"La taille de mon vecteur est 5 donc il le voit bien : "<<Vect->ReadFromFile().size()<<endl<<endl;
    		getchar();
    		cout<<"---------------------Test-------------------------"<<endl;
     
    		cout<<"test"<<Vect->ReadFromFile().begin()->first.c_str()<<endl;//ok
    		cout<<"test"<<Vect->ReadFromFile().begin()->second<<endll;//ok
     
    		for (map<string, float>::iterator iter = Vect->ReadFromFile().begin();iter != Vect->ReadFromFile().end() ;  ++iter)
    		{
    			cout<<"test";
     
    		cout<<"iter"<<iter->first;
    		}
    J'ai ce dernier soucie à la compil :
    plantage avec message d'erreur pas commun, une fenetre windows se lance et à pour titre "VS Debug library" :

    Debug assertion failed!
    ....
    ....
    Expression : map/set iterators imcompatible
    Vous savez de quoi cela provient?


    Pour te répondre 3D ARCHI :
    Si ton constructeur ne fait rien (ni liste d'initialisation, ni code), alors ne le définit pas. Le compilateur t'en construira un par défaut qui ira très bien, du moins tant que tu n'auras pas défini un autre constructeur avec des arguments.
    Entendu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sauf à ce que tu compte dériver tes classes, tu n'a pas à déclarer tes destructeurs en virtual
    Je fais dans le vrai code l'héritage, mais pour cet exemple il est vrai que c'est inutile.

    Merci à vous.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Aie, soucis classique .

    Quand tu appele
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vect->ReadFromFile().begin()
    , tu instance une nouvelle map (aucun doute vu que tu renvoies par copie).

    Du coup, quand tu appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Vect->ReadFromFile().end()
    tu instancies encore un autre map.

    Tu te retrouve avec un begin() associe a une map, et un end() associe a une autre map. Il ne reste plus qu'a calculer une fois pour toute Vect->ReadFromFile() dans une map, et de travailler avec celle-ci.

  17. #17
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Oui c'est exactement cela Solkien.
    J'ai fais comme tu as dit pour résoudre mon problème
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    map<string, float> testmap;
    		testmap = Vect->ReadFromFile();
     
     
     
    		for (map<string, float>::iterator iter = testmap.begin(); iter != testmap.end();  ++iter)
    		{
    			cout<<iter->first<<"--"<<iter->second<<endl;
    			temp = pow(iter->second,2);
    			cout<<"result : "<<temp;
    		//cout<<"iter"<<iter->first;
    		}
    Cela dit, j'ai l'impression que je fais la même chose qu'avant sauf qu'au lieu d'instancier ma map dans l'iterator je l'instancie avant.
    Mais dans l'iterator, . begin et . map me refais deux instances. Donc sa me semble être exactement la même chose.

    Je dois encore réfléchir la dessus. Le principal c'est que ça marche maintenant.

    Merci à vous tous, pour ces discussions très productives.
    Julien

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 35
    Points : 39
    Points
    39
    Par défaut
    Tu crées une instance a chaque fois que tu appelles ReadFromFile. Ces instances contiennent la meme chose (si le fichier d'entrée n'a pas bouge) mais sont stockes a deux endroits différents de la mémoire.

    Du coup, map1.begin() et map2.end() sont incompatible car en incrémentant map1.begin(), tu arriveras a map1.end() qui est un lieu différent en mémoire de map2.end().

  19. #19
    Membre régulier
    Inscrit en
    Février 2009
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 141
    Points : 91
    Points
    91
    Par défaut
    Ok c'est très clair maintenant.

    Alors qu'en faisant comme tu m'as expliquer je ne crée qu'une seule instance, ce qui fait toute la différence.

    Merci

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/10/2007, 18h04
  2. Réponses: 5
    Dernier message: 10/10/2007, 13h54
  3. Appel d'une fonction dans une autre classe
    Par Analfabete dans le forum wxPython
    Réponses: 3
    Dernier message: 01/10/2007, 09h45
  4. Réponses: 2
    Dernier message: 22/12/2006, 11h35
  5. Probleme appel de fct dans une autre classe
    Par crakotte_finance dans le forum C++
    Réponses: 6
    Dernier message: 09/10/2006, 21h22

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