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

Langage C++ Discussion :

Pointeur sur classe template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut Pointeur sur classe template
    Bonjour à tous,
    J'ai un problème de pointeur sur une classe template.
    Voici l'architecture de mon programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // A.h
    template<int entier,typename T>
    class A {
       ...
    }
     
    // B.h
    template<int autreentier>
    class B {
       protected :
       A<int entier,typename T> * ptr;
       ...
    }
    Je souhaiterais que la classe B possède une variable membre privée qui soit un pointeur sur la classe A, seulement A et B sont templatée de manière différentes.
    J'ai essayé de mettre le code de A et B dans le même .h mais le compilateur ne différencie pas bien les deux templates.

    Est-ce que cela est possible ?

    Merci.

  2. #2
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Salut,

    Si tu veux que la classe B possède une variable membre privée qui soit un pointeur sur la classe A, il faut que 'typename T'soit dans le template de B et donc il faut que ta classe B soit déclarée comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    // B.h
    #include "A.h"
     
    template<int autreentier, typename T>
    class B {
       protected :
       const int n = 5;
       A<5 , T> * ptr;
       ...
    }
    ou bien si tu sais quel est le 'typedef' que tu utilisera dans B, tu peux directement écrire :
    par exemple si tu veux un pointeur sur A<5, double> ( ici le 'typedef T' est connu à l'avance, c'est 'double' )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    // B.h
    #include "A.h"
     
    template<int autreentier>
    class B {
       protected :
       const int n = 5;
       A<5 , double> * ptr;
       ...
    }

  3. #3
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Merci pour ta réponse, j'ai pu résoudre une partie de mes problèmes.

    Je colle de nouveau devant une erreur à la compilation.

    Voici l'architecture de mon programme :

    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
     
    // A.h
     
    template<int entier, typename T>
     
    class A {
    ...
    }
     
     
    // B.h
     
    template<int autreentier, int entier, typename T>
     
    class B {
    private :
    // Tableau de pointeur sur B
    B ** tabptrB;
    A<entier,T> * ptrA;
    ...
    }
    Dans le constructeur de la classe B, je fais ceci pour initialiser mon tableau de pointeur de taille 2*autreentier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    this->tabptrB = new B<autreentier-1,entier,T> * [2*autreentier];
     
    for(int i = 0; i < 2*autreentier; i++) {
    	this->tabptrB[i] = new B<autreentier-1,entier,T>;
    }
    Et cette ligne me renvoie une erreur étrange :

    error C2440: '=' : impossible de convertir de 'B<autreentier,entier,T> **' en 'B<autreentier,entier,T> **'
    J'ai du louper quelque chose :/
    J'ai chercher un petit sur internet pour essayer de comprendre mais rien de très convaincant.

    Encore merci pour l'aide.

  4. #4
    Invité
    Invité(e)
    Par défaut
    En C++, pour les tableaux dynamiques, utilise plutot la classe std::vector :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /// b.hpp
    template<int unautreentier, int unentier, typename T>
    class B
    {
    /* ... */
    std::vector<B*> tabPtrB;
    /* ... */
    }:
     
    /// b.cpp
     
    B::B() : tabPtrB(2*unautreeniter)
    {}
    D'autre part si tu ne change pas la taille de ton tableau autre part dans ton code autant utiliser un tableau statique et, tant qu'à faire, si tu en a la possibilité (c'est-à-dire tr1 ou boost ou c++11) un (std:: )(boost:: )(std::tr1:: )array
    Dernière modification par Invité ; 23/04/2011 à 11h54.

  5. #5
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Merci pour la réponse, malheureusement cela serait trop simple.
    Je dois utiliser un tableau dynamique. La taille de ce dernier sera initialisée à la création d'un objet B et ne bougera plus. Cependant, les objets B n'auront pas tous la même taille de tableau.

    Je n'arrive pas à comprendre ce qui cloche dans mon code, et je ne comprends pas du tout l'erreur renvoyée par le compilo :/

  6. #6
    Invité
    Invité(e)
    Par défaut
    En fait tu n'a pas compris ce que sont les classes templates : ce sont des modèles, des patrons de classes; ce ne sont pas des classes. Et tu ne peux donc pas avoir de pointeurs sur B, ni affecter un pointeur sur un B paramétré d'une certaine manière à un pointeur sur un B paramétré d'une autre manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    B* p1; // invalide : les paramètre template ne sont pas précisés
    B<5, 1, double>* p2; // ok
    B<3, 1, double>* p3; // ok
    p2 = p3; // ko : les paramètre template ne sont pas les mêmes
    (note : à l'interieur de ta classe B désigne B<autreentier, entier, T> c'est juste un racourci).
    Pour résoudre ton problème je te conseille fortement de prendre autreentier comme argument du constructeur plutot que comme paramètre template et tant qu'à faire d'utiliser un std::vector.

    EDIT : En fait ton compilateur te signale que tu affecte un B<autreentier-1, entier, T>** à B<autreentier, entier, T>**. Mais de toutes façon ton code comporte un TRES grosse erreur : ce constructeur est récursif va donc essayer de créer une infinité de B (en fait le compilateur va déjà bugger en tentant de créer 2^32 classes formées sur le modèle de B).

Discussions similaires

  1. Imiter la POO (pointeur sur classe)
    Par actuenligne dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 30/06/2011, 23h37
  2. [Template] Pointeur sur classe template
    Par Kromagg dans le forum Langage
    Réponses: 2
    Dernier message: 29/10/2008, 16h01
  3. [Débutant] Passage de pointeur et classe template
    Par guigouz dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2008, 14h58
  4. Réponses: 4
    Dernier message: 15/10/2006, 18h05
  5. Problème de pointeurs sur classe
    Par fabiin dans le forum Delphi
    Réponses: 1
    Dernier message: 05/08/2006, 18h13

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