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'appel de méthode


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 27
    Points : 47
    Points
    47
    Par défaut problème d'appel de méthode
    Bonjour

    J'ai un petit problème et je ne sais pas si c'est possible (j'aimerais bien quand même )

    Dans les exemple ci dessous je souhaiterais que le dernier appel arrive dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static void fromString( materielB* t)
    Ce code n'est qu'un exemple et ne fait absolument pas ce qu'il devrait faire au vu des nom de méthodes. Si besoin je renomme et clarifie le code.
    Je suis sur VS2005, mais j'ai testé le code dans sans template avec gcc aussi (je n'ai pas réussi à le compilé avec les template ... mais la n'est pas le problème)

    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
    66
    67
    68
    69
    70
     
     
    #include <iostream>
     
    class materiel
    {
    public:
    	virtual bool dosomeThing() = 0;
    };
     
    class materielA : public materiel
    {
    public:
    	virtual bool dosomeThing(){return true;}
     
    };
     
    class materielB : public materiel
    {
    public:
    	virtual bool dosomeThing(){return true;}
     
    };
     
    class materielC : public materiel
    {
    public:
    	virtual bool dosomeThing(){return true;}
     
    };
     
     
    class IsGoodArg
    {
    public:
     
    	template<typename T> 
    	static void isGoodArg( T* t )
    	{
    		std::cout << "generic"  << std::endl;
    	}
     
    	template<>
    	static void isGoodArg<materielC>( materielC* t)
    	{
    		std::cout << "materielC"  << std::endl;
    	}
     
    	template<>
    	static void isGoodArg<materielB>( materielB* t)
    	{
    		std::cout << "materielB"  << std::endl;
    	}
     
    };
    int main(int argc, char* argv[])
    {
     
    	materielA a;
    	materielB b;
    	materielC c;
     
    	materiel *d = new materielB();
    	IsGoodArg::isGoodArg(&a);
    	IsGoodArg::isGoodArg(&b);
    	IsGoodArg::isGoodArg(&c);
    	IsGoodArg::isGoodArg(d);
     
    	return 0;
    }

    J'ai aussi essayé sans template. J'étais parti sur des template mais au final il ne me sont pas forcément utile

    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
    66
    67
     
     
    #include <iostream>
     
    class materiel
    {
    public:
    	virtual bool dosomeThing() = 0;
    };
     
    class materielA : public materiel
    {
    public:
    	virtual bool dosomeThing(){return true;}
     
    };
     
    class materielB : public materiel
    {
    public:
    	virtual bool dosomeThing(){return true;}
     
    };
     
    class materielC : public materiel
    {
    public:
    	virtual bool dosomeThing(){return true;}
     
    };
     
     
    class IsGoodArg
    {
    public:
     
    	static void isGoodArg( materiel* t )
    	{
    		std::cout << "generic"  << std::endl;
    	}
     
    	static void isGoodArg( materielC* t)
    	{
    		std::cout << "materielC"  << std::endl;
    	}
     
    	static void isGoodArg( materielB* t)
    	{
    		std::cout << "materielB"  << std::endl;
    	}
    };
     
    int main(int argc, char* argv[])
    {
     
    	materielA a;
    	materielB b;
    	materielC c;
     
    	materiel *d = new materielB();
    	IsGoodArg::isGoodArg(&a);
    	IsGoodArg::isGoodArg(&b);
    	IsGoodArg::isGoodArg(&c);
    	IsGoodArg::isGoodArg(d);
     
    	return 0;
    }
    Merci à tous les curieux qui passeront.
    Un plus grand merci à ceux qui auront peut être une idée à me soumettre


    Ambroise

  2. #2
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 580
    Points : 7 712
    Points
    7 712
    Par défaut
    Bonjour Ambroise,

    Tes exemples utilisent :
    1. méthode virtuelle pour dosomeThing(), permet de retrouver à l'exécution l'action correspondant à l'objet appelant.
    2. méthode template pour isGoodArg(), la sélection de la fonction dépend de la valeur 'au moment de la compilation'
    3. méthode avec surdéfinition de isGoodArg(), même capacité qu'avec le templates.
    Tu as bien parcouru les possibilités. Tu souhaites une action où la fonction à retrouver dépend du 'vrai' type de l'objet (comme le cas a), mais sélectionne à partir d'un paramètre (comme les cas b et c.)
    Le seul moyen de retrouver un type dynamique est l'utilisation de méthodes virtuelles (ou les dynamic_cast<>())
    Et comme la sélection par paramètre nécessite une surdéfinition ou des template. Je te propose de relier ces capacités par une fonction 'relai'.
    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
    class materiel {
    public:
    	virtual void relay() = 0;
    };
    class materielA : public materiel {
    public:
    	void relay() override;
    };
    class materielB : public materiel {
    public:
    	void relay() override;
    };
     
    class IsGoodArg {
    public: 
    	static void isGoodArg( materielA* t) {
    		std::cout << "materielC"  << std::endl;
    	}
    	static void isGoodArg( materielB* t) {
    		std::cout << "materielB"  << std::endl;
    	}
    };
     
    void materielA::relay()  { IsGoodArg::isGoodArg( this ); /*appelera isGoodArg( materielA* )*/ }
    void materielB::relay()  { IsGoodArg::isGoodArg( this ); /*appelera isGoodArg( materielB* )*/ }

  3. #3
    Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2007
    Messages : 27
    Points : 47
    Points
    47
    Par défaut
    Bonjour dalfab,

    Effectivement sur mes templates j'ai confondu instance et type de données.
    Et effectivement, j'avais oublié deux ou trois principes sur l'héritage.

    J'ai bien ton idée de relay. Je vais essayer de le modifier pour mes besoins.

    En tout cas merci de ton aide

    Ambroise

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

Discussions similaires

  1. Problème d'appel de méthode d'objets COM
    Par tibobao dans le forum C#
    Réponses: 0
    Dernier message: 03/08/2010, 17h35
  2. Problème d'appel des méthodes OpenGL
    Par choko83 dans le forum OpenGL
    Réponses: 5
    Dernier message: 24/04/2008, 10h02
  3. Problèmes d'appels de méthodes
    Par parano dans le forum C++
    Réponses: 7
    Dernier message: 07/03/2007, 12h08
  4. Héritage : problème d'appel de méthodes
    Par parano dans le forum C++
    Réponses: 15
    Dernier message: 02/03/2007, 14h42
  5. Problème pour appeler une méthode d'une autre classe
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 7
    Dernier message: 03/03/2006, 13h33

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