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 class et arguments pour fonctions et new


Sujet :

C++

  1. #1
    Membre tr�s actif
    Inscrit en
    D�cembre 2004
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 188
    Par d�faut Type de class et arguments pour fonctions et new
    Bonjour, voici ce que je voudrais faire, je ne sais pas si c'est possible en C++ :
    - passer un type comme argument d'une fonction
    - utiliser ce type comme param�tre de new

    Imaginons une classe base, avec des descendants (fille1, fille2,...) o� type_class_base repr�sente le type class base et ses descendants �ventuels, et type_class un type de la famille de types type_class_base.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    void func(type_class_base type_class)
    {
       base *newvar;
     
       newvar = new type_class(); 
    }
    ...
    func(fille2); // Création d'une instance de la class fille2
    Merci pour votre aide

  2. #2
    Invit�
    Invit�(e)
    Par d�faut
    tu veux faire un template quoi ...

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    template<T> func() {
        Base* pBase = new T;
    }

  3. #3
    Membre tr�s actif
    Inscrit en
    D�cembre 2004
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 188
    Par d�faut
    C'est un peu comme un template, sauf que dans ce cas je veux restreindre le type T � la classe Base et ses descendants (et je voudrais �viter que la classe Base soit template)

  4. #4
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par Alfred12
    C'est un peu comme un template, sauf que dans ce cas je veux restreindre le type T � la classe Base et ses descendants (et je voudrais �viter que la classe Base soit template)
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    template<T> func() {
        if (T typeof Base) {
            Base* pBase = new T;
        }
    }
    je ne connais pas la syntaxe exacte du typeof, mais il sert a ce genre de chose... �videmment, si tu passes un type qui h�rite de Base, ca marchera aussi

  5. #5
    Membre tr�s actif
    Inscrit en
    D�cembre 2004
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 188
    Par d�faut
    J'ai �crit ca, ca passe � la compil mais je ne sais pas comment appeler func()
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class base
    {
    public:
       template <typename T> func();
    };
     
    template <typename T> func()
    {
       if (T == typeof(base)) {
          base *obj = new T;
       }
    }

  6. #6
    Membre tr�s actif
    Inscrit en
    D�cembre 2004
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 188
    Par d�faut
    mais je ne sais pas comment appeler func()
    Si, a priori ca devrait �tre :

  7. #7
    Invit�
    Invit�(e)
    Par d�faut
    je me demande s'il ne faut pas mettre la classe en template aussi :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    template<T> class base { ... };
    et apres, tu l'apelles dans ce style la :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    base<MonType> b;
    b.func();

  8. #8
    Membre tr�s actif
    Inscrit en
    D�cembre 2004
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 188
    Par d�faut
    D'apr�s le Mega Cours C++, il est possible d'avoir une fonction template dans une classe qui ne l'est pas.

    En fait j'ai un probl�me � la compilation (r�f�rence externe non-trouv�e sur ma fonction template). J'ai aussi essay� de faire une fonction template � l'ext�rieur de ma classe et j'ai le m�me probl�me.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    template <typename T> void func()
    {
        base *obj = new T;
    }
    ...
    func<fille>();  // Référence externe non-trouvée

  9. #9
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Alfred12
    Bonjour, voici ce que je voudrais faire, je ne sais pas si c'est possible en C++ :
    - passer un type comme argument d'une fonction
    - utiliser ce type comme param�tre de new
    Tu veux du polymorphisme parametrique. La voie normale en C++ c'est d'utiliser les template:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    template<typename T>base* func() {
       return new T();
    }
     
    base* x = func<fille>();
    avec la contrainte que le type soit connu a la compilation. Si ce n'est pas le cas, on peut l'exprimer d'une autre maniere en utilisant les autres polymorphismes disponibles. Il nous faut un objet pour representer le type et que cet objet puisse fournir un pointeur vers un objet construit par defaut:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    struct baseBuilder {
       virtual base* build() const {return new base(); } // ou = 0?
    };
    Il faut de tels objets pour tous les descendants de base, donc
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
     
    template <typename T> class baseDescendantBuilder: public baseBuilder {
       base* build() const { return new T(); }
    };
    func est alors simplement:
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    base* func(baseBuilder const& builder) {
       return builder.build();
    }
     
    ...
    base* x = func(baseDescendantBuilder<fille>());
    ...
    C'est plus complique que le code precedant, mais on peut trimbaler des references ou des pointeurs vers les descendant de baseBuilder. On peut faire de celui-ci un singleton si besoin est.

    De la on peut aussi partir dans au moins trois directions:
    - etendre baseBuilder pour construire aussi d'autres types. Il est maintenant mal nomme, mais on arrive au pattern factory.
    - etendre baseBuilder pour contenir d'autres information sur le type. Ca permet de faire une sorte d'introspection et on se retrouve avec une extension du RTTI et quelque chose de semblable aux meta-classes d'autres langages.
    - fusionner baseBuilder avec base (on appelle alors generalement build() clone() et on lui fait generer une copie de l'objet sur lequel on l'appelle plutot qu'un objet construit par defaut).

  10. #10
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Alfred12
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    template <typename T> void func()
    {
        base *obj = new T;
    }
    ...
    func<fille>();  // Référence externe non-trouvée
    Je ne vois rien de bizarre. Donne un code complet, minimal et ne presentant que l'erreur qui te preoccupe ici.

  11. #11
    Membre tr�s actif
    Inscrit en
    D�cembre 2004
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2004
    Messages : 188
    Par d�faut
    Je ne vois rien de bizarre.
    Effectivement, j'avais mis le code du template dans le fichier .cpp. Dans le fichier d'ent�te ca marche beaucoup mieux.

    Merci pour cette r�ponse d�taill�e. En fait je ne sais pas encore si j'aurais besoin de la seconde solution que je vais regarder de pr�s mais la premi�re, sugg�r�e aussi par toxcct, fonctionne maintenant et correspond � mes besoins imm�diats.



    if (T == typeof(base)) {
    base *obj = new T;
    }
    En fait ca ne compile pas du tout et c'est inutile car si T n'est pas de type base le code ne compile pas.

  12. #12
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Alfred12
    Effectivement, j'avais mis le code du template dans le fichier .cpp. Dans le fichier d'ent�te ca marche beaucoup mieux.
    J'aurais du y penser. C'est une

  13. #13
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    On peut utiliser le SFINAE pour d�tecter si la classe re�ue d�rive bien publiquement de Base. Je suppose qu'avec les concepts du C++09, on pourra faire des trucs encore plus propres.

    Il y a des trucs pour faire �a dans Loki (qui sont d�taill� dans une section d'un chapitre de Modern C++ Design), et probablement dans boost aussi.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  14. #14
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Luc Hermitte
    On peut utiliser le SFINAE pour d�tecter si la classe re�ue d�rive bien publiquement de Base.
    On veut ici que l'instanciation �choue dans ce cas, ce qu'elle fait toute seule... qu'apporterait SFINAE?

  15. #15
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Des macros qui vont permettre des choses un chouilla plus g�n�riques, qui permettront � leur tour de renvoyer un T* plut�t qu'un Base*, tout en apportant la contrainte, et sans jouer avec des casts explicites.

    Si renvoyer un Base* suffit. Et bien .. ca suffit effectivement amplement
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  16. #16
    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
    Y'a les type traits de TR1 pour �a (qui proviennent de boost).
    is_base_of permet en particulier de savoir si un type est une base ou est d�riv� d'un autre type.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Passer une class comme argument de fonction
    Par Pelote2012 dans le forum D�veloppement Web avec .NET
    R�ponses: 2
    Dernier message: 07/08/2014, 12h03
  2. [XE2]Type de classe en param�tre de fonction
    Par Papy214 dans le forum Langage
    R�ponses: 5
    Dernier message: 09/05/2012, 11h21
  3. Type d'argument pour appel de fonction dans une DLL
    Par Lio590 dans le forum API, COM et SDKs
    R�ponses: 3
    Dernier message: 06/07/2011, 16h28
  4. R�ponses: 14
    Dernier message: 26/01/2011, 22h18
  5. [.NET2.0][C#]Passage type de classe dans une fonction
    Par SLE dans le forum Windows Forms
    R�ponses: 4
    Dernier message: 06/06/2006, 15h48

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