IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème sur les pointeurs en C++


Sujet :

C++

  1. #1
    Membre confirmé Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Par défaut Problème sur les pointeurs en C++
    Bonjour à tous,
    J'ai un problème qui me semble basic en c++ mais j'ai un soucis que je n'arrive pas à corriger. Voici mes classes
    Classe Client:
    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
    #include "client.h" // class's header file
     
    // class constructor
    Client::Client()
    {
    	cout<<"Initialisation d'un client ..."<<endl;
    }
     
    // class destructor
    Client::~Client()
    {
    	// insert your code here
    }
     
    int Client::depot_espece(int montant)
    {
    	cout<<"Dépot espèce d'un montant de "<<montant<<endl;
    	Compte compt = this->get_compte();
    	int solde_courant = compt.get_solde_compte_courant();
    	cout<<"solde_courant: "<<solde_courant<<endl;
     
    	int nouveau_solde = solde_courant + montant;
     
    	cout<<"nouveau_solde : "<<nouveau_solde<<endl;
     
    	compt->set_solde_compte_courant(nouveau_solde);
     
    	return nouveau_solde;
    }
    Main

    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
    #include <cstdlib>
    #include <iostream>
     
    #include "client.h"
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        std::cout<<"Hello world"<<std::endl;
        Client * client = new Client();
        client->depot_espece(100);
     
        //Affichage du solde actuel du compte du client
        cout<<"Nouveau solde après dépot d'espèce :"<<client.get_compte().get_solde_compte_courant()<<endl;
     
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    Mais ce code plante juste au moment de l'appel de la méthode depot_espece() après la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<"Dépot espèce d'un montant de "<<montant<<endl;
    J'ai comme l'impréssion que j'utilise mal les pointeurs.
    Auriez vous une piste.

    Merci d'avance
    dialloma

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    La ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<"Nouveau solde après dépot d'espèce :"<<client.get_compte().get_solde_compte_courant()<<endl;
    de ta fonction main() est déjà fausse, car clientest... un pointeur, et ce devrait au minimum etre client->get_compte()

    Je ne serais pas étonné que les autres erreurs soient sensiblement identiques, mais, pour pouvoir en être sur, il faudrait au minimum nous donner la définition de ta classe Client

    Ainsi, la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Compte compt = this->get_compte();
    m'interpelle car, de mon avis, il est plus que vraisemblable que get_compte() devrait soit renvoyer un pointeur, soit renvoyer une référence, et, partant de là, compt devrait être déclaré comme... un pointeur ou une référence...

    De plus, il n'est finalement pas nécessaire d'utiliser l'accesseur sur le compte du client pour accéder... à ce compte depuis... le client lui-même...

    Pourquoi ne pas, tout simplement, utiliser directement le membre compte (ou similaire) de la classe client (*)

    (*) sauf si, bien sur, le compte est en réalité un membre privé d'une classe héritée par client
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre confirmé Avatar de dialloma
    Homme Profil pro
    Java / J2EE, PHP
    Inscrit en
    Août 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Java / J2EE, PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 70
    Par défaut
    merci koala01 pour ta reponse. je t'envoie la définition de ma classe et de son implémentation.

    Classe Client:

    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
    #ifndef CLIENT_H
    #define CLIENT_H
     
    #include <iostream>
    using namespace std;
     
    class Client : public ModeleBase
    {
    	public:
    		// class constructor
    		Client();
    		// class destructor
    		~Client();
     
    		int virement(Compte compte);
     
    		int emission_cheque(int montant);
     
    		int retrait_espece(int montant);
     
    		int depot_espece(int montant);
     
     
            string get_prenom()
    		{
                return *_prenom;
            }
     
            void set_prenom(string prenom)
            {
                 _prenom = &prenom;
            }
     
     
            Compte get_compte()
    		{
                return *_compte;
            }
     
            void set_compte(Compte compte)
            {
                 _compte = &compte;
            }
     
     
    	private:
    		string * _prenom ;
    		Compte * _compte ;
    };
     
    #endif // CLIENT_H
    L'implémentation de la classe:


    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
    #include "client.h" // class's header file
     
    // class constructor
    Client::Client()
    {
    	cout<<"Initialisation d'un client ..."<<endl;
    }
     
    // class destructor
    Client::~Client()
    {
    	// insert your code here
    }
     
    int Client::virement(Compte compte)
    {
    	/* TODO (#1#): Implement Client::virement() */
     
    }
     
    int Client::depot_espece(int montant)
    {
    	/* TODO (#1#): Implement Client::depot_espece() */
    	cout<<"Dépot espèce d'un montant de "<<montant<<endl;
    	Compte compt = get_compte();
    	int solde_courant = compt.get_solde_compte_courant();
    	cout<<"solde_courant: "<<solde_courant<<endl;
     
    	int nouveau_solde = solde_courant + montant;
     
    	cout<<"nouveau_solde : "<<nouveau_solde<<endl;
     
    	compt.set_solde_compte_courant(nouveau_solde);
     
    	return nouveau_solde;
    }
     
    int Client::retrait_espece(int montant)
    {
    	/* TODO (#1#): Implement Client::retrait_espece() */
    }
     
    int Client::emission_cheque(int montant)
    {
    	/* TODO (#1#): Implement Client::emission_cheque() */
    }
    La classe mère de client:

    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
    #ifndef MODELEBASE_H
    #define MODELEBASE_H
     
    #include<string>
     
    using namespace std;
     
    class ModeleBase
    {
    	private:
                int * _id;
                string * _nom;
                string * _adresse;
     
        public:
    		// class constructor
    		ModeleBase();
    		// class destructor
    		virtual ~ModeleBase();
     
    		int get_id()
    		{
                return *_id;    
            }
     
            void set_id(int id)
            {
                 _id = &id;
            }
     
            string get_nom()
    		{
                return *_nom;    
            }
     
            void set_nom(string nom)
            {
                 _nom = &nom;
            }
     
            string get_adresse()
    		{
                return *_adresse;    
            }
     
            void set_adresse(string adresse)
            {
                 _adresse = &adresse;
            }
     
    };
     
    #endif // MODELEBASE_H
    et le main:

    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
    #include <cstdlib>
    #include <iostream>
     
    #include "client.h"
     
    using namespace std;
     
    int main(int argc, char *argv[])
    {
        std::cout<<"Hello world"<<std::endl;
        Client client;
        client.depot_espece(100);
     
        cout<<"Nouveau solde après dépot d'espèce :"<<client.get_compte().get_solde_compte_courant()<<endl;
     
     
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    merci d'avance
    dialloma

Discussions similaires

  1. Problème de compréhension d'un exercice sur les pointeurs
    Par neufrdb dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 28/05/2011, 23h58
  2. Petit problème sur les pointeurs :
    Par bertry dans le forum Débuter
    Réponses: 9
    Dernier message: 15/03/2011, 10h18
  3. questions sur les pointeurs
    Par Hyoga dans le forum C++
    Réponses: 17
    Dernier message: 08/01/2005, 23h25
  4. [TTreeView] Problème avec les pointeurs d'objet
    Par BlackWood dans le forum Composants VCL
    Réponses: 2
    Dernier message: 02/07/2004, 14h31
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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