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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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...

+ 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