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 éclairé
    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
    Points : 877
    Points
    877
    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 éclairé
    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
    Points : 877
    Points
    877
    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
    Points : 3 156
    Points
    3 156
    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()
    {
    }
    Find me on github

  4. #4
    Membre éclairé
    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
    Points : 877
    Points
    877
    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
    Points : 3 156
    Points
    3 156
    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.
    Find me on github

  6. #6
    Membre éclairé
    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
    Points : 877
    Points
    877
    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 éclairé
    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
    Points : 877
    Points
    877
    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 éclairé
    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
    Points : 877
    Points
    877
    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
    Points : 3 156
    Points
    3 156
    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.
    Find me on github

  10. #10
    Membre éclairé
    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
    Points : 877
    Points
    877
    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
    Points : 3 156
    Points
    3 156
    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 !
    Find me on github

  12. #12
    Membre éclairé
    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
    Points : 877
    Points
    877
    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