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 :

Appel fonction d'une classe B depuis classe A sur attributs de classe A


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 248
    Points : 74
    Points
    74
    Par défaut Appel fonction d'une classe B depuis classe A sur attributs de classe A
    Bonjour à tous les membres de cet excellent forum, voilà, tout est dans le titre...

    Je m'explique.

    Je suis dans une classe A, nommée: "square_detect"

    J'ai une classe B, nommée "france", dans laquelle j'ai des fonctions particulières, qui interagissent sur les attributs d'une classe A.

    Donc depuis ma classe A, je souhaite appeler cette fonction "recogNewAA_000_AA" de la classe B (j'ai donc créé une instance fr de la classe "france" dans la fonction findSquares de A):

    france.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void recognitionOld32(STRING &text, vector<int> &vectIndSpaces, int ie, STRING &filterText);
    square_detect.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    // une fonction de square_detect :
    Mat square_detect::findSquares(const Mat &image, vector<vector<Point>>& squares, int mode)
    {
     
    	france fr;
     
            (....)
            fr.recogNewAA_000_AA(filterText2, vectIndTiretsFilter, 0, filterText);
     
    }

    Je rentre alors bien dans ma fonction "recogNewAA_000_AA", j'ai vérifié. Par contre, je ne passe pas dans la parenthèse des check.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    void france::recogNewAA_000_AA(STRING &text, vector<int> &vectIndTirets, int it, STRING &filterText)
    {
     
    	square_detect sq;
     
    	if((sq.get_flag_type() == "neutre") || (sq.get_flag_type() == "plaque_france_new") ) // accesseurs bien implémentés et au début fllag_type est bien à "neutre"
    	{
    		cout << "ON Y RENTRE \n"; // NE PASSE PAS !! ca marchait avant, lorsque cette fonction était dans square_detect, et non dans france
     
     
    }

    Je suis donc bien formel, mon accesseur ne marche pas, flag_type est bien à "neutre" mais get flag_type ne renvoie rien !! et on ne rentre pas dans le if....

    ça sent l'erreur du débutant.... du style j'ai créé une nouvelle instance de classe ou les attributs sont nuls au départ... et vu que je n'ai pas fait de constructeur dans cette classe square_detect... bref mais moi je veux juste appeler une fonction de cette classe dans son état présent, sans créer une autre instance... j'ai toujours pas compris ça en langage objet apparemment, je rencontre toujours les même soucis !
    "Les ordinateurs font toujours ce qu'on leur dit, mais jamais ce qu'on veut."

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par wilfryjules Voir le message
    Je rentre alors bien dans ma fonction "recognitionOld32", j'ai vérifié. Par contre, je ne passe pas dans la parenthèse des check.
    Entre recognitionOld32 et recogNewAA_000_AA je suis un peu perdu.

    Comment fr.recogNewAA_000_AA(filterText2, vectIndTiretsFilter, 0, filterText); peut t'amener dans recognitionOld32 et non dans france::recogNewAA_000_AA ?
    Du coup est tu sur d'arriver dans france::recogNewAA_000_AA ?

    Montre voir le constructeur et get_flag_type de ta classe square_detect, au final c'est dans une de ces deux fonctions que doit se situer le problème SI france::recogNewAA_000_AA est bien appelée.

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 248
    Points : 74
    Points
    74
    Par défaut
    Merci Iradrille,

    Voilà j'ai corrigé,

    Je n'ai pas de constructeur pour cette classe,

    GetFlagType:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    string square_detect:: get_flag_type()
    {
    	return flag_type; 
    }
    Mais moi je cherche pas à recréer une classe, je cherche juste à appeler les fonction de cette classe A depuis classe B sans changer les paramètres des attributs ! On est obligé de recréer une instance pour ça ?
    "Les ordinateurs font toujours ce qu'on leur dit, mais jamais ce qu'on veut."

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par wilfryjules Voir le message
    J'ai pas de constructeur !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    square_detect sq;
     
    if((sq.get_flag_type() == "neutre") || (sq.get_flag_type() == "plaque_france_new") )
    Comment veux tu que flag_type soit égal à "neutre" ou à "plaque_france_new", s'il n'est pas initialisé ? (il vaudra toujours "" )

    Citation Envoyé par wilfryjules Voir le message
    Mais moi je cherche pas à recréer une classe, je cherche juste à appeler les fonction de cette classe A depuis classe B sans changer les paramètres des attributs ! On est obligé de recréer une instance pour ça ?
    Il te faut une instance oui, mais tu peux utiliser une instance existante
    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
    class square_detect {
    public:
        string get_flag_type() const; // la fonction à appeler
        Mat findSquares() {
            france fr(*this);
            fr.recogNewAA_000_AA();
        }
    };
     
    class france {
        square_detect& m_sd; // une ref sur une instance de square_detect
    public:
         explicit france(square_detect &sd): m_sd(sd) { }
         void recogNewAA_000_AA() { m_sd.get_flag_type(); }
    };

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 248
    Points : 74
    Points
    74
    Par défaut
    Merci pour toutes ces explications ! Oula c'est compliqué tout ça !

    Voici les erreurs que j'ai à présent... plus rien de marche, je pense que je vais revenir à un code plus simple avec une seule 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
    Erreur	8	error C2143: erreur de syntaxe*: absence de ';' avant '&'	c:\projetplaque_ocr\france.h	38
    Erreur	9	error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut	c:\projetplaque_ocr\france.h	38
    Erreur	10	error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut	c:\projetplaque_ocr\france.h	38
    Erreur	11	error C2061: erreur de syntaxe*: identificateur 'square_detect'	c:\projetplaque_ocr\france.h	39
    Erreur	12	error C2065: 'sd'*: identificateur non déclaré	c:\projetplaque_ocr\france.h	39
    Erreur	13	error C2614: 'france'*: initialisation de membre non conforme*: 'm_sd' n est ni une base ni un membre	c:\projetplaque_ocr\france.h	39
    Erreur	14	error C2511: 'std::string square_detect::get_flag_type(void)'*: impossible de trouver la fonction membre surchargée dans 'square_detect'	c:\projetplaque_ocr\square_detect.cpp	10
    Erreur	23	error C2664: 'france::france(const france &)'*: impossible de convertir le paramètre 1 de 'square_detect' en 'const france &'	c:\projetplaque_ocr\square_detect.cpp	1222
    Erreur	42	error C2143: erreur de syntaxe*: absence de ';' avant '&'	c:\projetplaque_ocr\france.h	38
    Erreur	43	error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut	c:\projetplaque_ocr\france.h	38
    Erreur	44	error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut	c:\projetplaque_ocr\france.h	38
    Erreur	45	error C2061: erreur de syntaxe*: identificateur 'square_detect'	c:\projetplaque_ocr\france.h	39
    Erreur	46	error C2065: 'sd'*: identificateur non déclaré	c:\projetplaque_ocr\france.h	39
    Erreur	47	error C2614: 'france'*: initialisation de membre non conforme*: 'm_sd' n est ni une base ni un membre	c:\projetplaque_ocr\france.h	39
    	57	IntelliSense*: déclaration incompatible avec "std::string square_detect::get_flag_type() const" (déclaré à la ligne 42 de "c:\projetplaque_ocr\square_detect.h")	c:\projetplaque_ocr\square_detect.cpp	9
    "Les ordinateurs font toujours ce qu'on leur dit, mais jamais ce qu'on veut."

  6. #6
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Salut,
    avec ça on ne va pas pouvoir t'aider beaucoup.
    Ce que je vois c'est que ton compilateur cherche ligne 38 dans france.h la définition de square_detect. Il te manque l'inclusion d'un header ou une forward declaration
    Homer J. Simpson


  7. #7
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 248
    Points : 74
    Points
    74
    Par défaut
    Merci Astraya, j'ai pourtant bel et bien inclus "square_detect.h" dans "france.h"...
    "Les ordinateurs font toujours ce qu'on leur dit, mais jamais ce qu'on veut."

  8. #8
    Membre chevronné Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 043
    Points : 2 234
    Points
    2 234
    Par défaut
    Vérifie les inclusions cyclique, c'est-à-dire:
    "square_detect.h" include "france.h" et "france.h" include "square_detect.h".
    Tu dois dans ce cas là faire une forward declaration : http://cpp.developpez.com/faq/cpp/?p...erence_croisee
    Homer J. Simpson


  9. #9
    Membre régulier
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juin 2011
    Messages
    248
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2011
    Messages : 248
    Points : 74
    Points
    74
    Par défaut
    Merci Astraya,

    je suis pour l'instant revenu à une configuration plus simple avec une seule classe, donc je testerai ça plus tard. Toutefois les informations fournies dans cette discussion restent utiles.
    "Les ordinateurs font toujours ce qu'on leur dit, mais jamais ce qu'on veut."

Discussions similaires

  1. Réponses: 3
    Dernier message: 01/12/2012, 12h00
  2. Appel fonction d'une classe dans une autre classe
    Par Snake-Eyes dans le forum C++
    Réponses: 3
    Dernier message: 05/05/2010, 16h46
  3. appeler fonction d'une autre classe pour faire une opération
    Par AzraHell dans le forum Débuter avec Java
    Réponses: 13
    Dernier message: 31/03/2009, 20h32
  4. Appel fonction d'une autre classe
    Par winnyzeboss1 dans le forum MFC
    Réponses: 5
    Dernier message: 12/03/2009, 09h25
  5. Appel fonction d'une classe
    Par totoche dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 26/02/2007, 15h56

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