Question

L'erreur exacte que je reçois est:

Impossible dynamic_cast 'objet' (de type '* vide') de type 'classe udDator (int) *' (Source n'est pas un pointeur vers une classe)

Ce qui se passe à l'intérieur d'un opérateur surchargée supprimer. Je tente de créer une classe de gestion de la mémoire qui peut hériter basé sur un modèle dans une autre classe, la gestion de la mémoire par des références. Ce serait en place de quelque chose comme un shared_ptr intelligent, dans une tentative de rendre la gestion de la mémoire encore plus invisible, et sans taper supplémentaire (shared_ptr commune (nouvelle someClass ()) est un peu longue ...).

, est ici tout cas le code correspondant. Si je l'ai oublié de mentionner tous les détails, ou ne pas avoir un code que vous avez besoin de voir, juste faites-moi savoir.

opérateur surchargée:

template< class T >
class udSharedMemory
{
public:
    void operator delete( void *object )
    {         
        T *temp = dynamic_cast< T* >( object ); //<------ ERROR!
        assert( temp && "Something went wrong during casting" );
        temp->release();
    }
}

class Templated:

template< class T >
class udDator : public udMemoryManaged, public udSharedMemory< udDator< T > >
{
// stuff
};

Utilisation de la classe templated:

udDator< int > *test = new udDator< int >( "5" );
Était-ce utile?

La solution

dynamique fonte exige un comportement polymorphique qui void n'a pas. Utilisez un static_cast à la place.

Autres conseils

En C ++, il n'y a aucun moyen de vérifier si un pointeur contient vraiment une adresse d'un objet d'un type donné polymorphes .

Vous devez avoir un pointeur sur l'une des bases. Par exemple, tirer tous les objets pertinents d'une interface polymorphes, prenez le pointeur vide, jeté à cette interface, et de là, vous pourrez dynamiquement jeter le type que vous devez effectuer la vérification de l'exécution.

  

dynamic_cast peut être utilisé uniquement avec   pointeurs et références à des objets.   Son but est de faire en sorte que la   résultat de la conversion de type est un   objet complet valide de la demande   classe.

http://www.cplusplus.com/doc/tutorial/typecasting/

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top