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 :

passage d'une classe à une autre


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut passage d'une classe à une autre
    Bonsoir,

    Alors voilà, malgré les tutos et les cours, j'ai un peu de mal à piger comment passer des variables d'une classe à une autre et comment bien déclarer les objets ( qui a dit "boulet" ? )

    J'ai une classe "Client" où je déclare 4 variables CString ( c'est un projet MFC ) :
    nom
    prenom
    adresse
    numero

    Et je veux les utiliser dans la classe "Enregistre"

    Donc j'imagine que je dois déclarer un objet "Client" dans mon "Enregistre.cpp" genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Client essai;
    essai = new Client;
    Et faire hériter la classe "Enregistre" de la classe "Client" comme ça:

    public Enregistre : public CDialog, public Client

    mais dès que je fais ça, ça me met tout plein d'erreurs comme ça :

    error C2594: 'static_cast' : conversions ambiguës de 'void (__thiscall CGnHrenregistre::* )(void)' en 'AFX_PMSG'

    pour cette ligne ( située dans le BEGIN_MESSAGE_MAP ) :

    ON_BN_CLICKED(IDC_CHER_CLI, OnBnClickedCherCli)

    Est-ce la bonne méthode ?
    Ou que me conseillez-vous ?

    Merci

  2. #2
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Client essai;
    essai = new Client;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Client *essai = new Client;
    Et je veux les utiliser dans la classe "Enregistre"
    En créant une fonction dans Enregistre qui reçoit un pointeur de Client ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void Enregistre::LitClient( Client *cl )
    {
        cl->nom;
        cl->prenom;
        ...
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut
    Alors, j'ai résolu une partie de mon problème.

    Je vous expose la seconde ( non non, je bataille pas comme un abruti lol )
    Toutes mes classes sont publiques

    J'ai une classe "Cpret" et une classe "Cclient".

    J'ai une classe "Cdemande" et une autre "Cenregistre"

    Dans "Cdemande", j'ai déclaré deux objets comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BOOL Cdemande::OnInitDialog()
    {
    	CDialog::OnInitDialog();
     
    	CGnHrpret pret;
    	pret = new Cpret;
    }
    et ça me renvoie les erreurs :

    error C2582: 'operator =' fonction non disponible dans 'Cpret'
    error C2065: 'pret' : identificateur non déclaré

    Je n'ai pas mis d'héritage. Quand je le fais ( class Cdemande : public CDialog, public Cpret ), ça par en live, encore plus.

    Merci beaucoup de votre aide !

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    On est en C++ ici, pas en Java... new retourne un pointeur vers une instance de l'objet, pas l'instance elle-même.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut
    Ba oui, le new c'est ce que mon prof de C++ nous a toujours dit de faire ... c'en est pas ???

  6. #6
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    CGnHrpret pret;
    pret = new Cpret;
    Non, si tu veux créer un pointeur, c'est comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CGnHrpret *pret = new Cpret;

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut
    Oui, merci, en effet.

    Cependant, mon erreur reste la même

    Je déclare ce pointeur au démarrage de la classe, dans la fonction OnInitDialog() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    BOOL CGnHrdemande::OnInitDialog()
    {
    	CGnHrpret *pret = new CGnHrpret;
    }
    et je veux l'utiliser dans la fonction OnBnClickedCalculer() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void CGnHrdemande::OnBnClickedCalculer()
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
    	double valeur,temp;
    	char *stopstring;
     
    	GetDlgItem(IDC_EDIT1)->GetWindowText(pret->objet);
    	GetDlgItem(IDC_EDIT2)->GetWindowText(pret->prix);
    .
    .
    .etc...
    Il ne passe pas apparemment.

  8. #8
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    Alors il faut placer pret dans la classe et non dans OnInitDialog.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut
    J'avais déjà essayé et il n'est toujours pas reconnu -_-

    Dites moi si vous avez besoin de + d'infos, je vois pas bien de quoi vous auriez besoin ...

  10. #10
    Membre chevronné Avatar de Mayti4
    Inscrit en
    Février 2004
    Messages
    442
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 442
    Par défaut
    Bizarre, fais voir la déclaration de la classe.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut
    Voilà Demande.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
    23
    24
    25
    26
    27
    28
    29
     
    class Cdemande : public CDialog
    {
    	DECLARE_DYNAMIC(Cdemande)
     
    public:
    	CGnHrdemande(CWnd* pParent = NULL);   // constructeur standard
    	virtual ~Cdemande();
     
    // Données de boîte de dialogue
    	enum { IDD = IDD_demande_pret };
     
    protected:
    	virtual void DoDataExchange(CDataExchange* pDX);    // Prise en charge DDX/DDV
    	DECLARE_MESSAGE_MAP()
     
    public:
    	afx_msg void OnBnClickedCalculer();
     
    public:
    	Cpret *pret;
    	CButton calculer;
    	CEdit prix_gen;
    	CButton val_prix;
    	CStatic glob_prix;
    	CStatic aff_euro;
    	afx_msg void OnBnClickedValPret();
    	//virtual BOOL OnInitDialog();
    };
    et Demande.cpp ( enfin, seulement la partie qui bugue )

    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
     
    /*BOOL Cdemande::OnInitDialog()
    {
    	Cpret *pret = new Cpret;
    }*/
     
    void Cdemande::OnBnClickedCalculer()
    {
    	// TODO : ajoutez ici le code de votre gestionnaire de notification de contrôle
    	double valeur,temp;
    	char *stopstring;
            pret = new Cpret;
    	GetDlgItem(IDC_EDIT1)->GetWindowText(pret->objet);
    	GetDlgItem(IDC_EDIT2)->GetWindowText(pret->prix);
    .
    .
    .etc...
    J'ai mis la fonction OnInitDialog() en commentaire au cas où je devrais m'en resservir.

    Merci

    EDIT : Quelques modifs oubliées

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Quand tu écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cpret *pret = new Cpret;
    Tu crées une nouvelle variable pret interne à ta méthode alors que tu veux modifier la variable globale.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut
    Miles > oui d'accord, merci

    Malheureusement, ça reste toujours pareil. J'ai tenté de le déclarer dans le constructeur, ça reste pareil.

    Le code de mon post précédent reste inchangé alors si quelqu'un a un éclair de génie ... je dois rendre ça mercredi matin et je patauge complet pour ce bug

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Dans le constructeur, tu l'a bien mis dans la liste d'initialisation ? - si tu ne sais pas ce que c'est, cf la FAQ -

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut
    oui oui, il y est bien :

    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
     
    // Demande.cpp : fichier d'implémentation
    //
     
    #include "stdafx.h"
    #include "tante.h"
    #include "Demande.h"
    #include ".\demande.h"
    #include "Client.h"
    #include "Pret.h"
     
     
    // Boîte de dialogue CDemande
     
    IMPLEMENT_DYNAMIC(Cdemande, CDialog)
    Cdemande::Cdemande(CWnd* pParent /*=NULL*/)
    	: CDialog(Cdemande::IDD, pParent)
    {
    	pret = new Cpret; //CONSTRUCTION
    }
     
    Cdemande::~Cdemande()
    {
    	delete pret; //DESTRUCTION
    }
     
    void CGnHrdemande::DoDataExchange(CDataExchange* pDX)
    {
    	CDialog::DoDataExchange(pDX);
    	DDX_Control(pDX, IDC_CALCULER, calculer);
    	DDX_Control(pDX, IDC_PRIX_GENERE, prix_gen);
    	DDX_Control(pDX, IDC_VAL_PRET, val_prix);
    	DDX_Control(pDX, IDC_GLOB_PRIX, glob_prix);
    	DDX_Control(pDX, IDC_EURO, aff_euro);
    }
     
     
    BEGIN_MESSAGE_MAP(Cdemande, CDialog)
    	ON_BN_CLICKED(IDC_CALCULER, OnBnClickedCalculer)
    	ON_BN_CLICKED(IDC_VAL_PRET, OnBnClickedValPret)
    END_MESSAGE_MAP()
     
     
    // Gestionnaires de messages CDemande

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Par défaut La classe Cpret
    Si le new ne fonctionne pas sur le Cpret , pourrais tu valider si le constructeur de Cpret
    1.- Classe Cpret visible ou tu fais le new (par un #include par ex.)
    2.- publique.
    3.- defini avec les bons parametres (dans ton cas aucun)

    Sinon donne l'interface de ta classe Cpret

    Frank


    sinon

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Initialisation != acquisition, chez toi, c'est de l'acquisition, mais bon, ce n'est pas le souci.

    Bon, quel est le bug actuel ? Puisqu'avant on sait pourquoi ça ne marchait pas, maintenant, ça doit être différent. - t'as testé le débuggeur ? -

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 43
    Par défaut
    Merci merci, c'est bon, j'ai réussi et euuuh

    *cherche comment dire ça sans passer pour un gros con*

    J'avais en effet oublié un #include en haut ...



    Je vous remercie beaucoup. Ca m'a au moins appris à mieux maîtriser les passages de valeurs entre classes

    Longue vie à ce forum et à ses pros

    Merci encore

    PS : J'ai dit "Merci" ?

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

Discussions similaires

  1. Passage d'argument d'une classe à une autre
    Par aurelie.guegan.15 dans le forum PyQt
    Réponses: 3
    Dernier message: 04/09/2014, 20h14
  2. C# passage d'objets d'une classe à une autre
    Par pascal4435 dans le forum C#
    Réponses: 10
    Dernier message: 27/02/2013, 15h45
  3. Passage de paramètre d'une classe à une autre
    Par minouche2 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 23/02/2011, 22h54
  4. passage des variables d'une classe à une autre
    Par zibou7 dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2007, 16h46
  5. Passage de paramètre d'une classe à une autre
    Par semenzato dans le forum C++
    Réponses: 3
    Dernier message: 21/09/2005, 13h59

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