Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Appel de fonction pure

4 réponses
Avatar
shaman
#include <iostream>
#include <conio.h>

using namespace std;

class BaseValue
{
public:
virtual ~BaseValue(){}
virtual const type_info & GetType() const =3D 0;
};

template<class ValueType>
class TypeValue : public BaseValue
{
public:
TypeValue(const ValueType & value)
: Value(value){ }

virtual const type_info & GetType() const {
return typeid(Value);
}

ValueType Value;
};

class RefAny
{
public: // structors

RefAny(){ }

template<class ValueType>
RefAny(const ValueType & value)
: content(&TypeValue<ValueType>(value)) { }

template<typename ValueType>
void GetValue(ValueType * value){
*value =3D static_cast<TypeValue<ValueType>*>(content)->Value;
}

template<typename ValueType>
void GetValueType(ValueType * value){
if (content->GetType() =3D=3D typeid(ValueType)) // content->type()
plantage appel de fonction pure
*value =3D static_cast<TypeValue<ValueType>*>(content)->Value;
// else
// wxASSERT(false);
}
BaseValue* content;
};

int main()
{
int Entier;
double Reel;
RefAny hTemp(3.14);

hTemp.GetValue(&Reel);
hTemp =3D 345;
hTemp.GetValue(&Entier);
hTemp =3D 784;
hTemp.GetValueType(&Entier); // --> plantage appel de fonction pure
hTemp.GetValueType(&Reel); // --> plantage appel de fonction pure
std::cout << "Appuyer sur une touche..." << endl;
_getch();
}

content->GetType() devrait faire un appel =E0 la m=E9thode GetType() de
TypeValue mais produit soit un plantage soit un appel de fonction pure
de BaseValue
Je pense que le probl=E8me doit venir de l'utilisation de template, mais
j'aimerais bien comprendre...

4 réponses

Avatar
Fabien LE LEZ
On 2 Dec 2005 11:01:08 -0800, "shaman" :

RefAny(const ValueType & value)
: content(&TypeValue<ValueType>(value)) { }


Ceci ne compile pas.
Tu crées un objet temporaire "TypeValue<ValueType>(value)", et tu mets
son adresse dans un pointeur membre. Ça n'a pas de sens, puisque
l'objet sera détruit immédiatement.

Je ne sais pas bien ce que tu veux faire, mais pour que ça ait un tant
soit peu de sens, il faudrait écrire :

: content (new TypeValue<ValueType>(value))

Avatar
shaman
Merci pour votre aide, effectivement j'ai zappé la création de cette
variable temporaire, mais ce qui est étonnant dans cette erreur c'est
que visual studio ne la pas signalée et que le plantage se produise
après les appels hTemp.GetValue(&Reel);et de hTemp.GetValue(&Entier);
qui fonctionne !!! sur une variable qui aurait du déjà être
détruite à ce moment... Le fait que cette variable n'est pas
détruite immédiatement génère des erreurs à des endroits
différents (bonjour la prise de tête).
Avatar
Fabien LE LEZ
On 2 Dec 2005 12:21:11 -0800, "shaman" :

mais ce qui est étonnant dans cette erreur c'est
que visual studio ne la pas signalée


VC++ présente là manifestement un comportement douteux. Je ne sais pas
en revanche si c'est étonnant.
Quelle version as-tu ?

Je te conseille d'avoir un deuxième compilo (Comeau par exemple) pour
tester ton code.

et que le plantage se produise après les appels


Non, ça c'est normal : il s'agit de ce qu'on appelle un "comportement
indéfini" -- la norme ne prévoit pas ce qui va se passer, et
effectivement on a un plantage à un endroit bizarre, éventuellement
aléatoire.

Avatar
shaman
J'ai visual studio 2003, en fait il faut passer en warnings Niveau 4
(/W4) pour avoir ça :
e:programmationSOURCE_dotnetconsoleArray_multi_typeArray_multi_type.h( 246)
: warning C4238: extension non standard utilisée : classe rvalue
utilisée comme lvalue
main.cpp(552) : voir la référence à l'instanciation du
modèle de fonction 'RefAny::RefAny<double>(const ValueType & )' en
cours de compilation
with
[
ValueType=double
]
e:programmationSOURCE_dotnetconsoleArray_multi_typeArray_multi_type.h( 246)
: warning C4238: extension non standard utilisée : classe rvalue
utilisée comme lvalue
main.cpp(557) : voir la référence à l'instanciation du
modèle de fonction 'RefAny::RefAny<int>(const ValueType & )' en cours
de compilation
with
[
ValueType=int
]
Donc c'est moi qui à tout faux(comme dab), et visual fonctionne
parfaitement.