> T'es sur que le probleme vient du compilo et que tu n'as pas fait une bourde qui par chance passe dans gcc ?
Voilà ce qui ne marchait pas (une petite partie des entêtes) : class CMixerBmpD3D : public virtual CBmpD3DDesc {
virtual ... = 0 ;
}
class CMixerBmpD3DSurf : public virtual CMixerBmpD3D {
}
class CMixerBmpD3DTex : public virtual CMixerBmpD3D {
}
class CMixerShot : public virtual CShotDesc, public virtual CMixerBmpD3D {
int entier_CMxierShot ;
virtual ... = 0 ;
void fonction_CMixerShot() {
entier_CMixerShot++ ;
}
class CMixerShotSurf : public virtual CMixerShot, public virtual CMixerBmpD3DSurf {
}
class CMixerShotTex : public virtual CMixerShot, public virtual CMixerBmpD3DTex {
}
Ce qui ne marchait était par exemple :
CMixerShotTex * pTex = new CMixerShotTex ;
CMixerShot * pShot = pTex ;
pShot->fonction_CMixerShot() ; // plantage.
Il n'y a pas forcément plantage à l'appel de la fonction mais plantage lors de "entier_CMixerShot++". Un affichage de "*this" dans le débuggeur donne du n'importe quoi alors que je suis dans une fonction membre ! C'est définitivement une erreur du compilateur.
Autre problème :
CMixerShotTex * pTex = new CMixerShotTex ;
CMixerShot * pShot = dynamic_cast<CMixerShot *>(pTex) ;
Le dynamic_cast n'est pas nécessaire. Mais si je l'utilise, pShot est égal à NULL. C'est encore définitivement une erreur du compilateur.
Autre problème :
CMixerShotTex * pTex = new CMixerShotTex ;
f(pTex) ;
f(CMixerShot * pShot) {
CMixerShotTex * pTex = dynamic_cast<CMixerShotTex *>(pShot) ; // retourne NULL alors que c'est un CMixerShotTex *
}
Pour régler le problème, j'ai viré CMixerShot (j'ai déplacé des données/fonctions) et tout regroupé dans CMixerBmpD3D.
> T'es sur que le probleme vient du compilo
Oui, j'ai vu une page web qui en parle mais je ne l'ai plus. Parfois VC++ n'arrive pas à déterminer le type d'un object.
Les "public virtual" sont nécessaires car il y a des données en commun entre CShotDesc et CMixerBmpD3D entre autre.
[^] # Re: Re:
Posté par IsNotGood . En réponse au journal Fin de gcc dans les *BSD ?. Évalué à 1.
Voilà ce qui ne marchait pas (une petite partie des entêtes) :
class CMixerBmpD3D : public virtual CBmpD3DDesc {
virtual ... = 0 ;
}
class CMixerBmpD3DSurf : public virtual CMixerBmpD3D {
}
class CMixerBmpD3DTex : public virtual CMixerBmpD3D {
}
class CMixerShot : public virtual CShotDesc, public virtual CMixerBmpD3D {
int entier_CMxierShot ;
virtual ... = 0 ;
void fonction_CMixerShot() {
entier_CMixerShot++ ;
}
class CMixerShotSurf : public virtual CMixerShot, public virtual CMixerBmpD3DSurf {
}
class CMixerShotTex : public virtual CMixerShot, public virtual CMixerBmpD3DTex {
}
Ce qui ne marchait était par exemple :
CMixerShotTex * pTex = new CMixerShotTex ;
CMixerShot * pShot = pTex ;
pShot->fonction_CMixerShot() ; // plantage.
Il n'y a pas forcément plantage à l'appel de la fonction mais plantage lors de "entier_CMixerShot++". Un affichage de "*this" dans le débuggeur donne du n'importe quoi alors que je suis dans une fonction membre ! C'est définitivement une erreur du compilateur.
Autre problème :
CMixerShotTex * pTex = new CMixerShotTex ;
CMixerShot * pShot = dynamic_cast<CMixerShot *>(pTex) ;
Le dynamic_cast n'est pas nécessaire. Mais si je l'utilise, pShot est égal à NULL. C'est encore définitivement une erreur du compilateur.
Autre problème :
CMixerShotTex * pTex = new CMixerShotTex ;
f(pTex) ;
f(CMixerShot * pShot) {
CMixerShotTex * pTex = dynamic_cast<CMixerShotTex *>(pShot) ; // retourne NULL alors que c'est un CMixerShotTex *
}
Pour régler le problème, j'ai viré CMixerShot (j'ai déplacé des données/fonctions) et tout regroupé dans CMixerBmpD3D.
> T'es sur que le probleme vient du compilo
Oui, j'ai vu une page web qui en parle mais je ne l'ai plus. Parfois VC++ n'arrive pas à déterminer le type d'un object.
Les "public virtual" sont nécessaires car il y a des données en commun entre CShotDesc et CMixerBmpD3D entre autre.