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 d'utilisation des classes


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut Problème d'utilisation des classes
    Bonjour,

    Je débute en C++, et je n'arrive pas à faire appel à une fonction définie dans une classe.

    Je suis sous Visual studio 2005, avec un projet MFC, et j'ai créé 2 fichiers pour ma classe :

    Classes.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #ifndef CCLASSES_H
    #define CCLASSES_H
     
    class CClasses
    {
    	DECLARE_DYNAMIC(CClasses)
    public:
    	void retourAccueil();
    };
     
    #endif
    Classes.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
    #include "stdafx.h"
    #include "CryptageCle.h"
    #include "AccueilDlg.h"
    #include "Classes.h"
     
    void CClasses::retourAccueil()
    {
    	AccueilDlg *m_AccueilDlgPtr;
    	m_AccueilDlgPtr =NULL;
    	BOOL ret=false;
    	m_AccueilDlgPtr = new AccueilDlg();
    	// créé un dialogue à pertir du modele en ressource
    	ret = m_AccueilDlgPtr->Create(IDD_ACCUEIL);
    	if(!ret) //Create failed.
    	MessageBox(0,_T("Erreur de création de la fenêtre principale"),NULL,0);
    	m_AccueilDlgPtr->ShowWindow(SW_SHOW);
    }
    Dans mon programme, j'ai inclu mon fichier classes.h

    Quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CClasses::retourAccueil();
    J'obtiens l'erreur de compilation suivante :
    1>c:\documents and settings\sylvain\bureau\pair\projet\cryptagecle\cryptagecle\ajoutsupprserrure.cpp(56) : error C2352: 'CClasses::retourAccueil' : appel non conforme d'une fonction membre non static
    J'ai regardé dans la FAQ, et j'ai l'impression que mon code est correct, je ne vois vraiment pas où est l'erreur.

    Merci d'avance pour votre aide

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    Hello,

    La méthode doit être appelée sur une instance de classe et non la classe elle même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CClasses a;
    //...
    a.retourAccueil;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    Merci pour ta réponse rapide.

    Je croyais que les deux solutions étaient possible, j'avais vu des appels avec la syntaxe que j'ai mis.
    Je viens de me rendre compte que c'était des méthodes virtuelles, ça doit venir de là.

    Cependant, en utilisant une instance de la classe, comme tu me l'as montré, j'ai l'erreur suivante :

    1>AjoutSupprSerrure.obj : error LNK2001: symbole externe non résolu "public: virtual struct CRuntimeClass * __thiscall CClasses::GetRuntimeClass(void)const " (?GetRuntimeClass@CClasses@@UBEPAUCRuntimeClass@@XZ)
    1>C:\Documents and Settings\Sylvain\Bureau\PAIR\Projet\CryptageCle\Debug\CryptageCle.exe : fatal error LNK1120: 1 externes non résolus
    Je pense que ça dois venir de ma classe qui est mal définie, et non de l'appel, cette fois ci, mais je ne vois pas comment corriger ça.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    J'ai trouvé le problème.

    J'ai supprimé la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE_DYNAMIC(CClasses)
    et j'arrive à exécuter mon programme.

    Merci encore pour ton aide.

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    DECLARE_DYNAMIC te donnait une erreur parce qu'il manquait le IMPLEMENT_DYNAMIC.

    Ensuite, tu n'en as généralement pas besoin en effet.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    DECLARE_DYNAMIC te donnait une erreur parce qu'il manquait le IMPLEMENT_DYNAMIC.

    Ensuite, tu n'en as généralement pas besoin en effet.

    Merci pour la précision.

    Par contre, j'ai rajouté une deuxième méthode à cette classe, et j'ai à nouveau une erreur.

    Voici mon code, la deuxième méthode permettrait de convertir des TCHAR* en char*.

    Classes.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 "stdafx.h"
    #include "CryptageCle.h"
    #include "AccueilDlg.h"
    #include "Classes.h"
     
    void CClasses::retourAccueil()
    {
    	AccueilDlg *m_AccueilDlgPtr;
    	m_AccueilDlgPtr =NULL;
    	BOOL ret=false;
    	m_AccueilDlgPtr = new AccueilDlg();
    	// créé un dialogue à pertir du modele en ressource
    	ret = m_AccueilDlgPtr->Create(IDD_ACCUEIL);
    	if(!ret) //Create failed.
    	MessageBox(0,_T("Erreur de création de la fenêtre principale"),NULL,0);
    	m_AccueilDlgPtr->ShowWindow(SW_SHOW);
    }
     
    void wtoc(char* Dest, TCHAR* Source)
    {
    USES_CONVERSION;
     
    strcpy (Dest, T2A (Source));
    }
    Classes.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #ifndef CCLASSES_H
    #define CCLASSES_H
     
    class CClasses
    {
     
    public:
    	void retourAccueil();
    public:
    	void wtoc(char* Dest, TCHAR* Source);
    };
     
    #endif
    J'ai l'erreur suivante :

    1>AjoutAcces.obj : error LNK2019: symbole externe non résolu "public: void __thiscall CClasses::wtoc(char *,wchar_t *)" (?wtoc@CClasses@@QAEXPADPA_W@Z) référencé dans la fonction "public: void __thiscall CAjoutAcces::OnBnClickedButtonSupprimerAcces(void)" (?OnBnClickedButtonSupprimerAcces@CAjoutAcces@@QAEXXZ)
    Désolé de rouvrir ce topic après l'avoir mis en résolu

    Merci d'avance

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Une erreur commune. T'imagines pas la fréquence à laquelle ça m'arrive.
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void CClasses::wtoc(char* Dest, TCHAR* Source)
    {
    	USES_CONVERSION;
     
    	strcpy (Dest, T2A (Source));
    }

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    PS: La fonction devrait s'appeler ttoc() et non wtoc().
    Ou mieux, faire deux (voire quatre) fonctions ctoc() surchargées.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    Merci pour la rapidité.

    Ca m'énerve de bloquer sur des trucs comme ça, quand la solution est si simple et qu'en plus je l'ai déjà juste au dessus

    J'ai changé le nom de la fonction, en ttoc, c'est vrai que c'est plus logique.
    Par contre, je vois pas ce que tu veux dire par des fonctions ctoc() surchargées.

    Je vais donc laisser comme ça pour le moment (sauf si tu as le temps de m'expliquer rapidement, mais je me débrouillerais sans, c'est juste pour apprendre, car mon programme fonctionne maintenant).

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Je pensais à un truc comme ça:
    Code C++ : 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
    void CClasses::ctoc(char* Dest, char const * Source)
    {
    	strcpy (Dest, Source);
    }
     
    void CClasses::ctoc(char* Dest, wchar_t const * Source)
    {
    	USES_CONVERSION;
     
    	strcpy (Dest, W2A(Source));
    }
     
    void CClasses::ctoc(wchar_t * Dest, char const * Source)
    {
    	USES_CONVERSION;
     
    	wcscpy (Dest, A2W(Source));
    }
     
    void CClasses::ctoc(wchar_t * Dest, wchar_t const * Source)
    {
    	wcscpy (Dest, Source);
    }

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 56
    Points
    56
    Par défaut
    OK, merci.

    Je ne savais pas qu'il était possible de faire un truc de ce genre.

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

Discussions similaires

  1. Problème de méthodologie sur l'utilisation des classes
    Par maxime.tuck dans le forum Général Python
    Réponses: 4
    Dernier message: 29/11/2013, 23h39
  2. Problème d'utilisation des attributs width et height avec une image distante
    Par Ptit_Mouss dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/09/2006, 15h40
  3. utiliser des classes C++ en delphi
    Par Guigui_ dans le forum Delphi
    Réponses: 6
    Dernier message: 07/07/2006, 10h29
  4. utiliser des classes dont on n'a pas le source
    Par kocin dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/08/2004, 16h05

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