Bonjour,
Désolé pour le titre un peu vague, mais comme je ne sais pas à quoi est du
mon problème, je n'ai pas pu le nommer...
J'ai un petit problème de conception et je ne comprend pas vraiment ce qui
se passe, j'explique: Je voudrai avoir une classe capable de réferencer
tous
les types des instances d'une classe template. J'ai fait un petit
prototype
qui se contente juste de les compter...
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
template <class T>
class DerivedType : public CountType
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Le code ci-dessus fonctionne bien comme je l'attend.
Si je fais les déclarations suivantes:
DerivedType<int> tint = DerivedType<int>::instance;
DerivedType<float> tfloat1 = DerivedType<float>::instance;
DerivedType<float> tfloat2 = DerivedType<float>::instance;
DerivedType<string> tstring = DerivedType<string>::instance;
cout << "type count: " << CountType::count << endl;
J'obtiens bien 3 types différents crées à partir de DerivedType<T>
Ca se complique lorsque je veux rajouter une méthode virtuelle dans
CountType. Là j'obtiens la valeur 0 et je ne comprend pas ce qui se passe
dans ce cas là... J'ai essayé de contourner le problème en mettant la
méthode virtuelle dans une autre classe et de faire de l'héritage multiple
dans DerivedType<T> mais le résultat est identique. Si j'enlève l'héritage
avec la classe contenant la méthode virtuelle, ca fonctionne.
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
class BaseType
{
public:
virtual void foo() = 0;
};
template <class T>
class DerivedType : public CountType, public BaseType // si j'enleve
BaseType, c'est ok
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Si quelqu'un pouvait m'expliquer ce qui se passe exactement et
éventuellement le moyen de réaliser ce que je veux faire, je l'en remercie
d'avance :)
Fred.
Bonjour,
Désolé pour le titre un peu vague, mais comme je ne sais pas à quoi est du
mon problème, je n'ai pas pu le nommer...
J'ai un petit problème de conception et je ne comprend pas vraiment ce qui
se passe, j'explique: Je voudrai avoir une classe capable de réferencer
tous
les types des instances d'une classe template. J'ai fait un petit
prototype
qui se contente juste de les compter...
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
template <class T>
class DerivedType : public CountType
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Le code ci-dessus fonctionne bien comme je l'attend.
Si je fais les déclarations suivantes:
DerivedType<int> tint = DerivedType<int>::instance;
DerivedType<float> tfloat1 = DerivedType<float>::instance;
DerivedType<float> tfloat2 = DerivedType<float>::instance;
DerivedType<string> tstring = DerivedType<string>::instance;
cout << "type count: " << CountType::count << endl;
J'obtiens bien 3 types différents crées à partir de DerivedType<T>
Ca se complique lorsque je veux rajouter une méthode virtuelle dans
CountType. Là j'obtiens la valeur 0 et je ne comprend pas ce qui se passe
dans ce cas là... J'ai essayé de contourner le problème en mettant la
méthode virtuelle dans une autre classe et de faire de l'héritage multiple
dans DerivedType<T> mais le résultat est identique. Si j'enlève l'héritage
avec la classe contenant la méthode virtuelle, ca fonctionne.
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
class BaseType
{
public:
virtual void foo() = 0;
};
template <class T>
class DerivedType : public CountType, public BaseType // si j'enleve
BaseType, c'est ok
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Si quelqu'un pouvait m'expliquer ce qui se passe exactement et
éventuellement le moyen de réaliser ce que je veux faire, je l'en remercie
d'avance :)
Fred.
Bonjour,
Désolé pour le titre un peu vague, mais comme je ne sais pas à quoi est du
mon problème, je n'ai pas pu le nommer...
J'ai un petit problème de conception et je ne comprend pas vraiment ce qui
se passe, j'explique: Je voudrai avoir une classe capable de réferencer
tous
les types des instances d'une classe template. J'ai fait un petit
prototype
qui se contente juste de les compter...
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
template <class T>
class DerivedType : public CountType
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Le code ci-dessus fonctionne bien comme je l'attend.
Si je fais les déclarations suivantes:
DerivedType<int> tint = DerivedType<int>::instance;
DerivedType<float> tfloat1 = DerivedType<float>::instance;
DerivedType<float> tfloat2 = DerivedType<float>::instance;
DerivedType<string> tstring = DerivedType<string>::instance;
cout << "type count: " << CountType::count << endl;
J'obtiens bien 3 types différents crées à partir de DerivedType<T>
Ca se complique lorsque je veux rajouter une méthode virtuelle dans
CountType. Là j'obtiens la valeur 0 et je ne comprend pas ce qui se passe
dans ce cas là... J'ai essayé de contourner le problème en mettant la
méthode virtuelle dans une autre classe et de faire de l'héritage multiple
dans DerivedType<T> mais le résultat est identique. Si j'enlève l'héritage
avec la classe contenant la méthode virtuelle, ca fonctionne.
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
class BaseType
{
public:
virtual void foo() = 0;
};
template <class T>
class DerivedType : public CountType, public BaseType // si j'enleve
BaseType, c'est ok
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Si quelqu'un pouvait m'expliquer ce qui se passe exactement et
éventuellement le moyen de réaliser ce que je veux faire, je l'en remercie
d'avance :)
Fred.
bonjour,
polymorphisme statique a l'aide de template.
Le problème c'est que j'en ai besoin de ce polymorphisme justement... Je ne
bonjour,
polymorphisme statique a l'aide de template.
Le problème c'est que j'en ai besoin de ce polymorphisme justement... Je ne
bonjour,
polymorphisme statique a l'aide de template.
Le problème c'est que j'en ai besoin de ce polymorphisme justement... Je ne
polymorphisme statique a l'aide de template.
polymorphisme statique a l'aide de template.
polymorphisme statique a l'aide de template.
Bonjour,
Désolé pour le titre un peu vague, mais comme je ne sais pas à quoi est du
mon problème, je n'ai pas pu le nommer...
J'ai un petit problème de conception et je ne comprend pas vraiment ce qui
se passe, j'explique: Je voudrai avoir une classe capable de réferencer tous
les types des instances d'une classe template. J'ai fait un petit prototype
qui se contente juste de les compter...
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
template <class T>
class DerivedType : public CountType
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Le code ci-dessus fonctionne bien comme je l'attend.
Si je fais les déclarations suivantes:
DerivedType<int> tint = DerivedType<int>::instance;
DerivedType<float> tfloat1 = DerivedType<float>::instance;
DerivedType<float> tfloat2 = DerivedType<float>::instance;
DerivedType<string> tstring = DerivedType<string>::instance;
cout << "type count: " << CountType::count << endl;
J'obtiens bien 3 types différents crées à partir de DerivedType<T>
Ca se complique lorsque je veux rajouter une méthode virtuelle dans
CountType. Là j'obtiens la valeur 0 et je ne comprend pas ce qui se passe
dans ce cas là... J'ai essayé de contourner le problème en mettant la
méthode virtuelle dans une autre classe et de faire de l'héritage multiple
dans DerivedType<T> mais le résultat est identique. Si j'enlève l'héritage
avec la classe contenant la méthode virtuelle, ca fonctionne.
Bonjour,
Désolé pour le titre un peu vague, mais comme je ne sais pas à quoi est du
mon problème, je n'ai pas pu le nommer...
J'ai un petit problème de conception et je ne comprend pas vraiment ce qui
se passe, j'explique: Je voudrai avoir une classe capable de réferencer tous
les types des instances d'une classe template. J'ai fait un petit prototype
qui se contente juste de les compter...
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
template <class T>
class DerivedType : public CountType
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Le code ci-dessus fonctionne bien comme je l'attend.
Si je fais les déclarations suivantes:
DerivedType<int> tint = DerivedType<int>::instance;
DerivedType<float> tfloat1 = DerivedType<float>::instance;
DerivedType<float> tfloat2 = DerivedType<float>::instance;
DerivedType<string> tstring = DerivedType<string>::instance;
cout << "type count: " << CountType::count << endl;
J'obtiens bien 3 types différents crées à partir de DerivedType<T>
Ca se complique lorsque je veux rajouter une méthode virtuelle dans
CountType. Là j'obtiens la valeur 0 et je ne comprend pas ce qui se passe
dans ce cas là... J'ai essayé de contourner le problème en mettant la
méthode virtuelle dans une autre classe et de faire de l'héritage multiple
dans DerivedType<T> mais le résultat est identique. Si j'enlève l'héritage
avec la classe contenant la méthode virtuelle, ca fonctionne.
Bonjour,
Désolé pour le titre un peu vague, mais comme je ne sais pas à quoi est du
mon problème, je n'ai pas pu le nommer...
J'ai un petit problème de conception et je ne comprend pas vraiment ce qui
se passe, j'explique: Je voudrai avoir une classe capable de réferencer tous
les types des instances d'une classe template. J'ai fait un petit prototype
qui se contente juste de les compter...
class CountType
{
public:
static size_t count;
CountType() {count++;}
};
size_t CountType::count = 0;
template <class T>
class DerivedType : public CountType
{
private:
DerivedType() {}
public:
static DerivedType<T> instance;
void foo() {}
};
template <class T>
DerivedType<T> DerivedType<T>::instance;
Le code ci-dessus fonctionne bien comme je l'attend.
Si je fais les déclarations suivantes:
DerivedType<int> tint = DerivedType<int>::instance;
DerivedType<float> tfloat1 = DerivedType<float>::instance;
DerivedType<float> tfloat2 = DerivedType<float>::instance;
DerivedType<string> tstring = DerivedType<string>::instance;
cout << "type count: " << CountType::count << endl;
J'obtiens bien 3 types différents crées à partir de DerivedType<T>
Ca se complique lorsque je veux rajouter une méthode virtuelle dans
CountType. Là j'obtiens la valeur 0 et je ne comprend pas ce qui se passe
dans ce cas là... J'ai essayé de contourner le problème en mettant la
méthode virtuelle dans une autre classe et de faire de l'héritage multiple
dans DerivedType<T> mais le résultat est identique. Si j'enlève l'héritage
avec la classe contenant la méthode virtuelle, ca fonctionne.
"Frédéric Gourul" writes:
int main() {
DerivedType<int> i1;
DerivedType<int> i2;
DerivedType<float> i3;
std::cout << CountType::count << std::endl;
}
Affiche 3 avec les 2 compilateurs que j'ai essaye.
"Frédéric Gourul" <fgourul.nospam@desysif.fr> writes:
int main() {
DerivedType<int> i1;
DerivedType<int> i2;
DerivedType<float> i3;
std::cout << CountType::count << std::endl;
}
Affiche 3 avec les 2 compilateurs que j'ai essaye.
"Frédéric Gourul" writes:
int main() {
DerivedType<int> i1;
DerivedType<int> i2;
DerivedType<float> i3;
std::cout << CountType::count << std::endl;
}
Affiche 3 avec les 2 compilateurs que j'ai essaye.
"Jean-Marc Bourguet" a écrit dans le message news:"Frédéric Gourul" writes:
int main() {
DerivedType<int> i1;
DerivedType<int> i2;
DerivedType<float> i3;
std::cout << CountType::count << std::endl;
}
Affiche 3 avec les 2 compilateurs que j'ai essaye.
Non, le but du jeu est, dans ce cas, d'obtenir la valeur 2:
"Jean-Marc Bourguet" <jm@bourguet.org> a écrit dans le message news:
pxb1xp1k3tz.fsf@news.bourguet.org...
"Frédéric Gourul" <fgourul.nospam@desysif.fr> writes:
int main() {
DerivedType<int> i1;
DerivedType<int> i2;
DerivedType<float> i3;
std::cout << CountType::count << std::endl;
}
Affiche 3 avec les 2 compilateurs que j'ai essaye.
Non, le but du jeu est, dans ce cas, d'obtenir la valeur 2:
"Jean-Marc Bourguet" a écrit dans le message news:"Frédéric Gourul" writes:
int main() {
DerivedType<int> i1;
DerivedType<int> i2;
DerivedType<float> i3;
std::cout << CountType::count << std::endl;
}
Affiche 3 avec les 2 compilateurs que j'ai essaye.
Non, le but du jeu est, dans ce cas, d'obtenir la valeur 2:
"Frédéric Gourul" writes:
N'y aurait-il pas un probleme d'initialisation de variables non
locales? Je ne vois pas de raison pour count (qui doit etre
initialise statiquement), mais pour vector<> dans un autre post, il
faudrait s'assurer qu'il est initialise avant les
DerivedType<>::instance et ca j'ai aucune idee si c'est defini ou pas.
Je crois qu'on a deja discutte de ca ici mais ne me souviens pas du
resultat (recherche avec les suspects habituels pour ce genre de
choses: Gaby, James)
"Frédéric Gourul" <fgourul.nospam@desysif.fr> writes:
N'y aurait-il pas un probleme d'initialisation de variables non
locales? Je ne vois pas de raison pour count (qui doit etre
initialise statiquement), mais pour vector<> dans un autre post, il
faudrait s'assurer qu'il est initialise avant les
DerivedType<>::instance et ca j'ai aucune idee si c'est defini ou pas.
Je crois qu'on a deja discutte de ca ici mais ne me souviens pas du
resultat (recherche avec les suspects habituels pour ce genre de
choses: Gaby, James)
"Frédéric Gourul" writes:
N'y aurait-il pas un probleme d'initialisation de variables non
locales? Je ne vois pas de raison pour count (qui doit etre
initialise statiquement), mais pour vector<> dans un autre post, il
faudrait s'assurer qu'il est initialise avant les
DerivedType<>::instance et ca j'ai aucune idee si c'est defini ou pas.
Je crois qu'on a deja discutte de ca ici mais ne me souviens pas du
resultat (recherche avec les suspects habituels pour ce genre de
choses: Gaby, James)
"Fabrizio Duhem" a écrit dans le message news:
402a267d$0$28634$
polymorphisme statique a l'aide de template.
J'ai à moitié résolu mon problème en utilisant une allocation dynamique
pour
les instances de mes types dérivés, ce qui donne ceci:
class BaseType;
class CountType
{
public:
static size_t count;
static vector<BaseType*> table;
};
size_t CountType::count = 0;
vector<BaseType*> CountType::table;
class BaseType
{
public:
static size_t count;
BaseType() {CountType::count++; CountType::table.push_back(this);}
virtual void foo() = 0;
};
template <class T>
class DerivedType : public BaseType
{
private:
DerivedType() {}
static DerivedType<T>* pinst;
public:
static DerivedType<T>* instance() {return pinst;}
void foo() {}
};
template <class T>
DerivedType<T>* DerivedType<T>::pinst = new DerivedType<T>();
DerivedType<int>* tint = DerivedType<int>::instance();
DerivedType<float>* tfloat1 = DerivedType<float>::instance();
DerivedType<float>* tfloat2 = DerivedType<float>::instance();
DerivedType<string>* tstring = DerivedType<string>::instance();
cout << "type count: " << CountType::count << endl;
cout << "table count: " << CountType::table.size() << endl;
J'ai bien la valeur 3 pour "type count", mais j'ai 0 pour la taille du
vecteur !!!!
Ce comportement bizarre m'a fait douter et j'ai testé le même code sur un
autre compilo (gcc) et là j'ai bien la valeur 3 pour les deux. D'ailleurs,
avec gcc, mon premier exemple était déja correct... Mais avec HP-UX aCC,
j'ai bien le problème... Je testerai ce soir sur VC pour voir ce que ca
donne.
Qui a raison ? A votre avis est-ce un bug de aCC ? Y'a-t-il quelque chose
que je fais mal ?
"Fabrizio Duhem" <fabrizio.duhem@free.fr> a écrit dans le message news:
402a267d$0$28634$626a14ce@news.free.fr...
polymorphisme statique a l'aide de template.
J'ai à moitié résolu mon problème en utilisant une allocation dynamique
pour
les instances de mes types dérivés, ce qui donne ceci:
class BaseType;
class CountType
{
public:
static size_t count;
static vector<BaseType*> table;
};
size_t CountType::count = 0;
vector<BaseType*> CountType::table;
class BaseType
{
public:
static size_t count;
BaseType() {CountType::count++; CountType::table.push_back(this);}
virtual void foo() = 0;
};
template <class T>
class DerivedType : public BaseType
{
private:
DerivedType() {}
static DerivedType<T>* pinst;
public:
static DerivedType<T>* instance() {return pinst;}
void foo() {}
};
template <class T>
DerivedType<T>* DerivedType<T>::pinst = new DerivedType<T>();
DerivedType<int>* tint = DerivedType<int>::instance();
DerivedType<float>* tfloat1 = DerivedType<float>::instance();
DerivedType<float>* tfloat2 = DerivedType<float>::instance();
DerivedType<string>* tstring = DerivedType<string>::instance();
cout << "type count: " << CountType::count << endl;
cout << "table count: " << CountType::table.size() << endl;
J'ai bien la valeur 3 pour "type count", mais j'ai 0 pour la taille du
vecteur !!!!
Ce comportement bizarre m'a fait douter et j'ai testé le même code sur un
autre compilo (gcc) et là j'ai bien la valeur 3 pour les deux. D'ailleurs,
avec gcc, mon premier exemple était déja correct... Mais avec HP-UX aCC,
j'ai bien le problème... Je testerai ce soir sur VC pour voir ce que ca
donne.
Qui a raison ? A votre avis est-ce un bug de aCC ? Y'a-t-il quelque chose
que je fais mal ?
"Fabrizio Duhem" a écrit dans le message news:
402a267d$0$28634$
polymorphisme statique a l'aide de template.
J'ai à moitié résolu mon problème en utilisant une allocation dynamique
pour
les instances de mes types dérivés, ce qui donne ceci:
class BaseType;
class CountType
{
public:
static size_t count;
static vector<BaseType*> table;
};
size_t CountType::count = 0;
vector<BaseType*> CountType::table;
class BaseType
{
public:
static size_t count;
BaseType() {CountType::count++; CountType::table.push_back(this);}
virtual void foo() = 0;
};
template <class T>
class DerivedType : public BaseType
{
private:
DerivedType() {}
static DerivedType<T>* pinst;
public:
static DerivedType<T>* instance() {return pinst;}
void foo() {}
};
template <class T>
DerivedType<T>* DerivedType<T>::pinst = new DerivedType<T>();
DerivedType<int>* tint = DerivedType<int>::instance();
DerivedType<float>* tfloat1 = DerivedType<float>::instance();
DerivedType<float>* tfloat2 = DerivedType<float>::instance();
DerivedType<string>* tstring = DerivedType<string>::instance();
cout << "type count: " << CountType::count << endl;
cout << "table count: " << CountType::table.size() << endl;
J'ai bien la valeur 3 pour "type count", mais j'ai 0 pour la taille du
vecteur !!!!
Ce comportement bizarre m'a fait douter et j'ai testé le même code sur un
autre compilo (gcc) et là j'ai bien la valeur 3 pour les deux. D'ailleurs,
avec gcc, mon premier exemple était déja correct... Mais avec HP-UX aCC,
j'ai bien le problème... Je testerai ce soir sur VC pour voir ce que ca
donne.
Qui a raison ? A votre avis est-ce un bug de aCC ? Y'a-t-il quelque chose
que je fais mal ?
Ce comportement bizarre m'a fait douter et j'ai testé le même code sur un
autre compilo (gcc) et là j'ai bien la valeur 3 pour les deux. D'ailleurs,
avec gcc, mon premier exemple était déja correct... Mais avec HP-UX aCC,
j'ai bien le problème... Je testerai ce soir sur VC pour voir ce que ca
donne.
Ce comportement bizarre m'a fait douter et j'ai testé le même code sur un
autre compilo (gcc) et là j'ai bien la valeur 3 pour les deux. D'ailleurs,
avec gcc, mon premier exemple était déja correct... Mais avec HP-UX aCC,
j'ai bien le problème... Je testerai ce soir sur VC pour voir ce que ca
donne.
Ce comportement bizarre m'a fait douter et j'ai testé le même code sur un
autre compilo (gcc) et là j'ai bien la valeur 3 pour les deux. D'ailleurs,
avec gcc, mon premier exemple était déja correct... Mais avec HP-UX aCC,
j'ai bien le problème... Je testerai ce soir sur VC pour voir ce que ca
donne.