C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Polymorphisme et template

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Frédéric Mayot
Guest





PostPosted: Tue May 25, 2004 4:25 pm    Post subject: Polymorphisme et template Reply with quote



Bonjour,

Voilà un petit bout de code qui compile mais qui plante à l'édition des
liens :

-------------------------------------------------------------
#include <iostream>

template <class T>
struct conteneur
{
T t;
T& get_value(){return t;}
};

struct base
{
virtual ~base(){}
virtual int f();
};

struct derive1 : public base
{
int f(){return 1;}
};

struct derive2 : public base
{
int f(){return 2;}
};

int main (int c, char** d)
{
conteneur<derive1> c1;
conteneur<derive2> c2;

conteneur<derive1>* p_c1 = &c1;
conteneur<derive2>* p_c2 = &c2;

conteneur<base>* p_b1 = reinterpret_cast<conteneur(p_c1);
conteneur<base>* p_b2 = reinterpret_cast<conteneur(p_c2);

std::cout << p_b1->get_value().f() << std::endl;
std::cout << p_b2->get_value().f() << std::endl;

return 1;
}

-------------------------------------------------------------

En gros, j'obtiens des pointeurs sur des instances de "conteneur" mais
dont je ne connais pas le paramètre du template. Par contre, je sais que
le paramètre est toujours une classe dérivée de "base".

Vous voyez ce qui cloche ?

Merci.

Fred
Back to top
Mathieu Roger
Guest





PostPosted: Tue May 25, 2004 6:18 pm    Post subject: Re: Polymorphisme et template Reply with quote



Frédéric Mayot a écrit :
Quote:
Bonjour,

Voilà un petit bout de code qui compile mais qui plante à l'édition des
liens :

-------------------------------------------------------------
#include <iostream

template struct conteneur
{
T t;
T& get_value(){return t;}
};

struct base
{
virtual ~base(){}
virtual int f();
};

struct derive1 : public base
{
int f(){return 1;}
};

struct derive2 : public base
{
int f(){return 2;}
};

int main (int c, char** d)
{
conteneur conteneur<derive2> c2;

conteneur<derive1>* p_c1 = &c1;
conteneur<derive2>* p_c2 = &c2;

conteneur<base>* p_b1 = reinterpret_cast<conteneur(p_c1);
conteneur<base>* p_b2 = reinterpret_cast<conteneur(p_c2);

std::cout << p_b1->get_value().f() << std::endl;
std::cout << p_b2->get_value().f() << std::endl;

return 1;
}

-------------------------------------------------------------

En gros, j'obtiens des pointeurs sur des instances de "conteneur" mais
dont je ne connais pas le paramètre du template. Par contre, je sais que
le paramètre est toujours une classe dérivée de "base".

Vous voyez ce qui cloche ?


Dans conteneur devez utiliser soit une référence (T&) soit un poiteur (T*)


car lorsque vous aveez écrit :
Quote:
conteneur<base>* p_b1 = reinterpret_cast<conteneur(p_c1);

vous avez, il me semble converti c1 en un conteneur<base> et donc :

conteneur<base> ==

struct conteneur
{
base t;
base& get_value()
{return t;}
};


et dans ce cas l'attribut t dans un objet de conteneur<base> est une
conversion vers base mais ne peut jamais être un objet ni de derive1 ni
de derive2
le problème d'édition de lien se trouve alors sur base::f() qui est
appelée sans qu'on ai fournit de corps

Ecrivez plutôt quelque chose comme :

template <class T>
struct conteneur
{
T* t;
T& get_value(){return *t;}
};

et

struct base
{
virtual ~base()
{}

// virtuel pur car on ne fournit pas de code
virtual int f() = 0 ;
};

C'est presque une règle de programmation : quand on manipule des objets
polymorphes, il faut le faire soit par pointeur soit par référence mais
jamais par valeur

Quote:

Merci.

Fred

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.