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 à appeler différentes fonction dans une liste chainée


Sujet :

C++

  1. #1
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut Problème à appeler différentes fonction dans une liste chainée
    Bonjour à tous

    Deja je vous explique ce que je veux faire.
    Je veux avoir une liste chainée qui contient des objets. jusque là ca va vous suivez? lol
    Ensuite j'aimerais qu'à un noeud précis de cette liste chainée, je puisse appeler n'importe quelle méthode de l'objet que la liste stocke.

    Ce que j'ai fait maintenant.
    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
    71
    72
    #include <iostream>
    #include "GSETEMPLATELIST.h"
     
    using namespace std;
     
    class TOTO
    {
    private:
    	int test;
     
    public:
    	TOTO(){test=0;};
    	~TOTO(){};
     
    	void SetValue(int v){test=v;};
    	int GetValue(void){return test;};
    	void Call(char *function_name)
    	{
    		string tmp=function_name;
     
    		if(tmp.compare("toto")==0)
    		{
    			cout << "appel de la fonction toto" << endl;
    		}
    		else if(tmp.compare("tutu")==0)
    		{
    			cout << "appel de la fonction tutu" << endl;
    		}
    		else if(tmp.compare("tata")==0)
    		{
    			cout << "appel de la fonction tata" << endl;
    		}
    	};
    };
     
    void main(void)
    {
    	GSETEMPLATELIST<TOTO> List;//Déclaration d'une liste chainée template de type TOTO 
    	TOTO *toto1,*toto2;
    	GSENODE<TOTO> *ptr;// Pointeur sur un noeud de la liste chainée de type TOTO
     
    	toto1=new TOTO();
    	toto2=new TOTO();
     
    	toto1->SetValue(0);
    	toto2->SetValue(45);
    	List.Add(toto1);
    	List.Add(toto2);
     
    	cout << List.GetSize() << endl;//Retourne le nb de noeud. 2 ici
     
    	ptr=List.GetNode(0);
     
    	if(ptr==NULL)
    	{
    		cout << "ptr null" << endl;
    	}
    	else
    	{
    		cout << ptr->Data->GetValue() << endl;//Retourne 45 car le dernier inséré est le premier de la liste
    	}
    	//Data est un pointeur sur les données du noeud
     
    	List.CallOn(0,TOTO::Call,"toto");//Appel sur le noeud numéro 0 de la fonction Call
    	//qui elle meme appelle la fonction toto
    	List.CallOn(1,TOTO::Call,"toto");
    	//Appel sur le noeud numéro 1 de la fonction Call
    	//qui elle meme appelle la fonction toto
    	List.CallOn(0,TOTO::Call,"tata");
    	//Appel sur le noeud numéro 0 de la fonction Call
    	//qui elle meme appelle la fonction tata
    }
    J'ai fait une fonction CallOn dans ma liste chainée qui prend en argument premier argument le numéro du noeud sur lequel je veux appeler ma fonction.
    Le 2e argument est le nom de la fonction Call. Cette fonction Call se charge d'apeler la fonction dont le nom est passé en 3e argument.

    Mon problème arrive avec le nombre d'arguments qui devient variable en fonction du nom de fonction qui est passé en 3e argument.

    Si la fonction toto prends 2 argument et la fonction tata aucun, comment je peux faire pour passer les argument ou pas à ma fonction CallOn?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    T'écris plusieurs fois la fonction avec un nombre différent de paramètres.
    Ou alors tu sors les variadic templates de C++0x.
    Ou alors tu fais un chaînage avec un opérateur au choix.

    Ou alors tu réutilises l'existant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::for_each(List.begin(), List.end(), boost::bind(TOTO::Call, _1, "toto"));
    À part ça, si je peux me permettre, ton truc est assez nul. Tu ferais mieux d'utiliser les conteneurs standard, ils sont bien mieux.

    Edit: apparemment j'ai mal lu, tu veux le faire que sur certains noeuds en particulier (du coup je comprends pas bien l'intérêt du truc). Enfin bon c'est pareil.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Par défaut
    je m'egare peut etre, mais pourquoi tu utiliserais pas une fonction qui te retournerait un pointeur sur le noeud pour ensuite appeler la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Liste.noeud (0)->Call ("toto"); // je sais plus s'il y a besoin de parenthese (Liste.noeud(0))

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Non y'a pas besoin de parenthèses.

  5. #5
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Je suis d'accord c'est nul mais c'es t censé valider des idées qui vont ensuite tourner sur un gros truc. Mon problème n'est pas d'appeler différentes fonctions mais c'est sur le nombre et le type d'argument de ces fonctions. Comment je peux à la fois connaitre le nombre et le type?
    Et l'idée d'utiliser la surcharge de fonction c'est un peu bourrin.

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Par défaut
    les fonctions variadic n'existent pas en C++, par contre si le nombre d'arguments maximum est connu à l'avance, tu peux utliser les arguments par défaut:
    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int unefonction (int arg1, int arg2=0);
    pour les types, tu peux utiliser les pointeurs sur void, mais c'est la porte ouverte au problemes.

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    drcd, je t'ai déjà donné la solution : boost::bind.
    Et ça fera partie de la prochaine version de C++.

  8. #8
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Citation Envoyé par loufoque
    drcd, je t'ai déjà donné la solution : boost::bind.
    Et ça fera partie de la prochaine version de C++.
    Heu j'ai pas le temps d'attendre la prochaine version de C++ sauf si elle sort demain lol. C'est portable et supporté par tous les compilateurs?

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    boost::bind marche depuis plusieurs années maintenant sur pas mal de compilateurs... Et quand ton compilateur sera à la prochaine norme C++ (c'est clairement pas demain, non), la transition devrait être facile (ou tu pourras toujours utiliser la version boost...).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre très actif
    Profil pro
    Responsable technique
    Inscrit en
    Février 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Responsable technique

    Informations forums :
    Inscription : Février 2006
    Messages : 366
    Par défaut
    Soit. Et elle fait quoi cette fonction?
    Sur la faq C++ elle y est pas et sur la doc officielle j'ai rien compris.

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Je t'ai montré un exemple plus haut...
    Et sinon lis la doc.

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/12/2014, 11h44
  2. Réponses: 2
    Dernier message: 05/01/2014, 01h07
  3. Réponses: 2
    Dernier message: 19/04/2010, 17h04
  4. fonction de recherche dans une liste chainée
    Par seifvai dans le forum C
    Réponses: 10
    Dernier message: 23/12/2007, 10h35
  5. Comment rappeler une fonction dans une liste déroulante
    Par strogos dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/05/2005, 23h54

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