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 :

appeler des methodes depuis une fonction :-(


Sujet :

C++

  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut appeler des methodes depuis une fonction :-(
    Bonjour tous,

    j'ai besoin d'un petit (gros) coup de main, je suis perdu avec ce C++

    1�) voici le contexte:
    je pars d'un d�but de code qu'une personne avait r�alis� et j'essai d'introduire une fonction qui m'effectue divers calculs.

    2�) voici quelques parties du programme:

    main.cpp

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "AAA.h"
    using namespace std;
    int main()
    {
        AAA *AAA = new AAA();
        delete AAA;
        return 0;
    }

    AAA.h

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class AAA
    {
        public:
            AAA();
            ~AAA();
        private:
    };

    AAA.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
     
    #include "AAA.h"
    #include "BBB.h"
    using namespace std;
    AAA::AAA()
    {
        string dump;
        vector<string> arg;
        string mon_fichier = "blablabla.txt";
        ifstream dataBase(mon_fichier.c_str(), ios::in);        
        if(dataBase)                                           
        {
            while (!dataBase.eof())                        
            {
                getline(dataBase,dump);       
                couper(dump,arg);
     
                if (arg[0]=="#")
                {
                    cout << dump << endl;
                }
                else if (arg[0]=="BBB")
                {
                    a=0;
                    a=arg.size()-1; 
                    if (a==4)
                    {
                        cout << "blablabla"  << endl;
                    }
                    else if (a<4)
                    {
                        cout << "blablabla"<< endl;
                        break;
                    }
                    BBB *bbb = new BBB();
                    bbb->Add_BBB(arg);
                    delete bbb;
                }
        }
        else
        {
            cout << "! unable to open database !" << endl;
        }
    }
    AAA::~AAA()
    {
    }
    o� la fonction couper n'est pas repr�sent� mais elle ser � mettre des string dans le vector arg

    BBB.h

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class BBB
    {
        public:
                BBB();
                ~BBB();
                void Add_BBB(std::vector<std::string>);
                double get_Parameter1(int);
        private:
                std::vector<std::string> Name;
                std::vector<double> Parameter1;
                std::vector<double> Parameter2;
    };

    BBB.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
     
    #include "BBB.h"
    using namespace std;
    BBB::BBB()
    {
    }
    BBB::~BBB()
    {
    }
    double BBB::get_Parameter1(int _i)
    {
            if(_i>=Parameter1.size())
        {
            cout << "blablabla" << endl;
            return -1;                                                       //the last version contain return "text" but we can't return text with a double function
        }
         return Parameter1[_i];
    }
    void BBB::Add_BBB(vector<string> _arg)
    {
        Name.push_back( _arg[1] );
        Parameter1.push_back( atof(_arg[2].c_str()) );
        Parameter2.push_back( atof(_arg[3].c_str()) );
    }
    3�) tous ce qui est fait ici est du classement:
    - dans AAA on lit un fichier texte et on classe les mots du fichier texte dans des attributs de la class BBB
    - ensuite on veut pouvoir acceder a ces attribut donc on fait des methodes dans BBB pour cela

  2. #2
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    Apr�s cette introduction, voici ce que je veux effectuer:

    je veux avoir une classe qui m'effectue des calculs une fois que tout est bien ordonn� (cf. programme message1)

    J'ai donc fait une classe calcul.cpp qui va recup�rer les donn�es des classes (type BBB)

    le probl�me est que je n'arrive pas � acceder � mes donn�es, car j'ai le message d'erreur suivant:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    bbb is not declared in this scope
    voici ma classe calcul
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include "BBB.h"
    #include "AAA.h"
    #include "Calcul.h"
    using namespace std;
    Calcul::Calcul()
    {
        cout << bbb->get_parameter1(1) << endl;
    }
    Calcul::~Calcul()
    {
    }
    et le .h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Calcul
    {
        public:
            Calcul();
            ~Calcul();
        private:
    };
    voici comment j'ai appel� ma classe dans la classe AAA:

    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
    AAA::AAA()
    {
        string dump;
        vector<string> arg;
        string mon_fichier = "blablabla.txt";
        ifstream dataBase(mon_fichier.c_str(), ios::in);        
        if(dataBase)                                           
        {
            while (!dataBase.eof())                        
            {
                getline(dataBase,dump);       
                couper(dump,arg);
     
                if (arg[0]=="#")
                {
                    cout << dump << endl;
                }
                else if (arg[0]=="BBB")
                {
                    a=0;
                    a=arg.size()-1; 
                    if (a==4)
                    {
                        cout << "blablabla"  << endl;
                    }
                    else if (a<4)
                    {
                        cout << "blablabla"<< endl;
                        break;
                    }
                    BBB *bbb = new BBB();
                    bbb->Add_BBB(arg);
                    delete bbb;
                }
        }
        else
        {
            cout << "! unable to open database !" << endl;
        }
     Calcul *calcul = new Calcul();
    }
    AAA::~AAA()
    {
    }

    J'ai essay� egalement:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    bbb.get_parameter1(1)
    meme erreur
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    BBB->get_parameter1(1)
    erreur: expected primary-expression before '->' token

    mais ca ne fonctionne pas non plus, comment dois je acc�der donc aux methodes "get" de ma classe BBB ?

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Salut

    - Je constate que tu as gard� ce mauvais design de traitement m�tier dans le constructeur de AAA. Pourquoi tu ne t'en d�barasses pas ? On en avait d�j� parl� dans un autre post. Tu refais la m�me erreur avec calcul. C'est un mauvais design. Il est parfaitement inutile d'utiliser des objets de cette mani�re. Autant utiliser des fonctions libres : C++ l'autorise, pourquoi s'en passer ?

    - Tu devrais donner des noms plus clairs � tes classes. AAA et BBB n'ont pas de sens. C'est bien pour des exemples de discussion sur les forums, mais au fur et � mesure que je te lis, j'ai l'impression que tu utilises VRAIMENT ces noms.

    - Enfin, ton code ne peut pas fonctione car "Calcul" ne peut pas conna�tre la variable "bbb". Il faut la lui donne � manger :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Calcul
    {
        public:
            Calcul();
            ~Calcul();
     
            FaireLeCalculCalcul(BBB& iBbbb);
        private:
    };
    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
    #include "BBB.h"
    #include "AAA.h"
    #include "Calcul.h"
    using namespace std;
     
    Calcul::Calcul()
    {
    }
     
    Calcul::FaireLeCalculCalcul(BBB& iBbbb)
    {
        cout << iBbbb.get_parameter1(1) << endl;
    }
    Calcul::~Calcul()
    {
    }

  4. #4
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    salut jblecanard,

    merci beaucoup de prendre le temps de repondre !

    Citation Envoy� par jblecanard Voir le message
    - Je constate que tu as gard� ce mauvais design de traitement m�tier dans le constructeur de AAA. Pourquoi tu ne t'en d�barasses pas ? On en avait d�j� parl� dans un autre post. Tu refais la m�me erreur avec calcul.
    oui, il est vrai que nous avions parl� de tous cela. mon probleme est que je ne bosse pas seul et les autres personnes (dont mon superieur) m'oblige � garder cette architecture

    ca tiendrai de moi j'aurai bien chang�

    Citation Envoy� par jblecanard Voir le message
    - Tu devrais donner des noms plus clairs � tes classes. AAA et BBB n'ont pas de sens. C'est bien pour des exemples de discussion sur les forums, mais au fur et � mesure que je te lis, j'ai l'impression que tu utilises VRAIMENT ces noms.
    en fait ce ne sont pas les vrai nom des variables, avant de poser un message je fais un "remplacer" dans mon programme pour changer les nom de variables/fonction

    Citation Envoy� par jblecanard Voir le message
    - Enfin, ton code ne peut pas fonctione car "Calcul" ne peut pas conna�tre la variable "bbb". Il faut la lui donne � manger :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    class Calcul
    {
        public:
            Calcul();
            ~Calcul();
            FaireLeCalculCalcul(BBB& iBbbb);
        private:
    };
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include "BBB.h"
    #include "AAA.h"
    #include "Calcul.h"
    using namespace std;
    Calcul::Calcul()
    {
    }
    Calcul::FaireLeCalculCalcul(BBB& iBbbb)
    {
        cout << iBbbb.get_parameter1(1) << endl;
    }
    Calcul::~Calcul()
    {
    }
    je vois ce que tu veux dire.

    En fait je dois "faire mon objet" bbb dans la classe calcul pour qu'il soit reconnaissable par cette classe mais le probl�me est que je dois aussi le faire dans la classe AAA pour pouvoir utiliser ma methode " add_BBB " dans AAA.


    je vais opter pour ta solution mais j'aurais pu d�clarer aussi bb en variable globale?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Tu peux peut �tre sugg�rer � ton sup�rieur une nouvelle approche ? Je sais ce que c'est ce n'est pas toujours possible. Mais l� � force de coder n'importe comment, �a finira par vous co�ter cher : le code est complexifi� pour rien et cela introduit des erreurs potentielles, et m�me peut �tre des fuites m�moires puisque vous faites des allocations dynamiques sans fondement. Dans ton code, tu subis les inconv�nients de la programmation objet sans utiliser les avantages.

    Bref, ce n'est pas le sujet du post. R�sumons :

    - Tu lis des donn�es
    - Tu les stocke dans un objet
    - Tu fais un calcul dessus

    Tu n'as pas besoin d'utiliser trois objets diff�rents, un seul suffit ! C'est l'int�r�t de la POO d'ailleurs. Voici un exemple de ce qu'on peut faire en objet. Je ne dis pas que c'est parfait, mais �a r�pond � tes besoins et c'est beaucoup plus simple :

    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
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
     
    struct Arg
    {
    	std::vector<std::string> data;
     
    	typedef std::vector<std::string> collection;
    	typedef collection::iterator iterator;
    };
     
    class Donnees
    {
    public:
    	Donnees(const std::string& iNomFichier);
    	virtual ~Donnees();
     
    	void Lire();
    	void Calculer();
     
    	typedef std::vector<Arg> collection;
    	typedef collection::iterator iterator;
     
    private:
    	std::string m_nomFichier;
    	std::vector< Arg > m_parametres;
    };
     
    Donnees::Donnees(const std::string& iNomFichier) : m_nomFichier(iNomFichier)
    {}
     
    Donnees::~Donnees()
    {}
     
    void Donnees::Lire()
    {
    	std::ifstream dataBase(m_nomFichier.c_str(), std::ios::in);
    	if(dataBase.is_open())
    	{
    		// Ton traitement avec stockage dans "m_parametres";
    	}
    }
     
    void Donnees::Calculer()
    {
    	for(Donnees::iterator param = m_parametres.begin(); param != m_parametres.end(); param++)
    	{
    		for(Arg::iterator valeur = param->data.begin(); valeur != param->data.end(); valeur++)
    		{
    			std::cout << *valeur;
    		}
     
    		std::cout << std::endl;
    	}
    }
     
    int main()
    {
    	Donnees mesDonnees("blablabla.txt");
    	mesDonnees.Lire();
    	mesDonnees.Calculer();
        return 0;
    }
    Les typedef servent � ajouter de la lisibilit�, mais on peut s'en passer.

  6. #6
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    merci beaucoup pour toute ton aide.

    h�las j'ai d�j� essay� d'en parl� � mon tuteur de tout cela mais la reponse est en gros: "on a commenc� comme �a, on fini comme cela"
    il n'a pas envi de changer ses habitudes...

    d'ailleurs c'est � cause de cette mani�re bizarre de programmer POO que je me perds... j'avais appris les bases du C++ de mani�re propre mais l� on m'oblige � programmer bizarre et je ne m'y retrouve plus du tout....

    pour les allocations dynamiques j'en bien remarqu� qu'on �t� pas oblig� de les utiliser mais il veut faire comme cela donc j'essai tant bien que mal � m'adapter...

  7. #7
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    je vais quand m�me essayer de lui faire comprendre que les allocations dynamiques sont � utiliser que si vraiment necessaire...

    merci en tout cas pour toute cette aide



    A+

  8. #8
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    j'ai suivi tes conseils et j'ai fait un peut le menage dans mon programme, par contre je t'avous que je n'ai pas compris comment tu as fait ci dessus pour avoir les elements contenus dans bbb

    Voici mon AAA.cpp � pr�sent:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    BBB bbb;
    //je fais des trucs
    //...
    //je renvoi mon vector de string (arg) à la fonction add_BBB
    bbb.Add_BBB(arg);
    //ensuite si je veux lire le contenu je fais:
      cout << bbb.get_Parametre(0) << endl;
     
    //à present je lance les calcul en appelant la fonction calcul
     
    calcul();
    Ce code fonctionne tr�s bien mais je ne veux pas faire:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
      cout << bbb.get_Parametre(0) << endl;
    dans la class AAA mais dans la fonction calcul.cpp

    ==> le probl�me est que je n'ai pas compris J-B comment tu as fait tout � l'heure

    ==> comment puis je utiliser cette commande:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    bbb.get_Parametre(0)
    dans une fonction autre que celle o� bbb a �t� d�clar� ?

    merci d'avance pour l'aide

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    La r�ponse � ta question est simple. Dans mon exemple, je n'ai pas utilis� une variable mais un attribut de l'objet. Les attributs sont accessibles dans toutes les m�thodes de l'objet en question. Dans mon cas, je n'ai utilis� qu'un seul objet (ce que je te recommande), et j'acc�de � l'attribut m_parametres.

    Dans ton cas tu as bbb. Si bbb est une variable, tu n'as pas le choix, tu dois le passer en argument (on peut aussi dire en param�tre) de la m�thode de calcul. Si bbb est un attribut, tu peux y acc�der depuis une autre m�thode de la classe auquel il appartient. Si c'est un attribut mais que tu veux y acc�der depuis une autre classe, m�me topo, il faut le passer en argument.

    Concr�tement dans ton cas, il faut appeler calcul(bbb); et pas calcul();, en utilisant une interface pour calcul telle que je t'ai montr� dans mes posts pr�c�dents. Mais je r�p�te : tu n'as pas besoin d'effectuer le calcul dans une autre classe.

    PS: J'ai mis des mots en gras pour attirer ton attention sur leur signification en programmation orient� objet. Si tu ne comprend pas, il n'y plus qu'une solution : te plonger dans un cours de programmation objet.

  10. #10
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    merci beaucoup j-b de ta reponse

    Citation Envoy� par jblecanard Voir le message
    Concr�tement dans ton cas, il faut appeler calcul(bbb); et pas calcul();,
    j'y ai pens� � cela mais je pensais qu'il y avait plus simple....

    je vais faire comme ceci je pense ou je vais peut etre declarer l'objet bbb en variables globale, a voir...

    (pour les mots en gras je les comprends mais j'ai encore un peu de mal � manipuler tout cela)

    merci encore pour toute ton aide!

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    D�tails du profil
    Informations personnelles :
    Localisation : France, Paris (�le de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par d�faut
    Citation Envoy� par 21did21 Voir le message
    je vais faire comme ceci je pense ou je vais peut etre declarer l'objet bbb en variables globale
    Non il ne faut pas faire �a. Passer un argument � une m�thode, �a n'a rien de compliqu�, c'est trivial !

  12. #12
    Membre �prouv�
    Profil pro
    Inscrit en
    F�vrier 2010
    Messages
    2 051
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2010
    Messages : 2 051
    Par d�faut
    Citation Envoy� par jblecanard Voir le message
    Non il ne faut pas faire �a. Passer un argument � une m�thode, �a n'a rien de compliqu�, c'est trivial !
    ok je vais donc faire la m�thode dont tu me parles

    merci pour tout ces conseils !!!!

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. comment appeler un widget depuis une fonction
    Par Thierry {-|-o dans le forum Tkinter
    R�ponses: 3
    Dernier message: 02/01/2008, 23h23
  2. R�ponses: 1
    Dernier message: 25/05/2007, 14h33
  3. Appel d'une fonction A depuis une fonction B.
    Par LeFlou dans le forum C++
    R�ponses: 9
    Dernier message: 22/05/2007, 17h36
  4. R�ponses: 12
    Dernier message: 30/06/2006, 16h46
  5. [Conception] Appel de methode depuis une conf xml de scenario
    Par jesus144 dans le forum Format d'�change (XML, JSON...)
    R�ponses: 2
    Dernier message: 17/03/2006, 12h56

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