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 :

Type de retour inconnu


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Par défaut Type de retour inconnu
    Bonsoir,

    Actuellement je développe un petit projet, mais je bloque sur une méthode particulière. J'aimerais créer une méthode qui retourne un objet dont on ne connait pas le type à l'avance. J'ai alors pensé aux templates, mais je ne pense pas que se soit la bonne solution :

    Voici ma classe principale :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    class Toto {
    public:
    ...
     
     
    template<class T>  T const& getDataAt(int x, int y);
     
    private:
        vector<A*> 	vect_A;
        vector<B*> 	vect_B;
    }
    Les classes A et B contiennent un objet de type Position qui contient deux entiers x et y.

    La méthode en question getEntityAt recherche dans chacun des vecteurs si un objet contient les même coordonnées. Dans ce cas, elle renvoie une référence constante vers cet objet.

    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
     
    template<class T>
    T const& Toto::getEntityAt(int x, int y) {
     
            // Recherche dans le vecteur de A
            int sizeA= vect_A.size();
            for (int i = 0; i < sizeA; i++) {
                if ((*vect_A[i]).getPosition().isEqual(x, y))
                    return vect_A[i];
            }
     
            // Recherche dans le vecteur de B
            int sizeB= vect_B.size();
            for (int i = 0; i < sizeB; i++) {
                if ((*vect_B[i]).getPosition().isEqual(x, y))
                    return vect_B[i];
            }
     
            // Sinon, on retourne autre chose (exception why not ?)
    }
    Malheureusement, cela ne marche pas. Si je fais appel à la méthode getEntityAt de la classe Toto, il me dit qu'il ne trouve aucune fonction correspondante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Toto t;
    
    t.getEntityAt(2,3);   // error: no matching function for call to `Toto::getEntityAt(int, int)'
    Auriez vous une idée de comment faire ? Dans le pire des cas, j'ai pensé a renvoyer un vecteur ne contenant qu'un seul élément (celui trouvé) ou aucun. Mais je trouve ça vraiment moche.. :-/

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par tittoto Voir le message
    J'ai alors pensé aux templates, mais je ne pense pas que se soit la bonne solution :
    Le template ne te permet pas de choisir dynamiquement le type en retour. Chaque instance du template correspond statiquement à un type. Donc cela ne résout pas ton problème.
    Il te faut utiliser autre chose (boost::variant?).

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 46
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Le template ne te permet pas de choisir dynamiquement le type en retour. Chaque instance du template correspond statiquement à un type. Donc cela ne résout pas ton problème.
    Il te faut utiliser autre chose (boost::variant?).
    C'est bien ce qu'il me semblait :-)

    Je vais me pencher sur les solutions proposées par JolyLoic.

  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
    J'aimerais créer une méthode qui retourne un objet dont on ne connait pas le type à l'avance. J'ai alors pensé aux templates, mais je ne pense pas que se soit la bonne solution
    Il faudra m'expliquer en quoi du typage dynamique te fait penser à fournir des types en paramètre à la compilation...

    Malheureusement, cela ne marche pas. Si je fais appel à la méthode getEntityAt de la classe Toto, il me dit qu'il ne trouve aucune fonction correspondante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Toto t;
     
    t.getEntityAt(2,3);   // error: no matching function for call to `Toto::getEntityAt(int, int)'
    Normal, tu as défini getEntityAt comme prenant en paramètre un type T, et tu n'as pas fourni ce paramètre.

    La méthode en question getEntityAt recherche dans chacun des vecteurs si un objet contient les même coordonnées. Dans ce cas, elle renvoie une référence constante vers cet objet.
    C'est a priori la fonction centrale de ton type; jolie complexité...
    Par ailleurs, pourquoi utilises-tu des conteneurs de pointeurs ? Il y a-t-il une raison autre que d'avoir des problèmes de gestion de ressources ?

    Sinon un variant de A& ou B& est a priori une bonne solution.

Discussions similaires

  1. Template et fonction amie / type de retour inconnu
    Par Armas dans le forum Débuter
    Réponses: 13
    Dernier message: 24/04/2013, 15h17
  2. Réponses: 25
    Dernier message: 04/06/2012, 22h02
  3. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54
  4. [type de retour pour un update]
    Par viny dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 21/03/2005, 21h08
  5. [type de retour dans une proc]
    Par viny dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 19/03/2005, 14h35

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