Question

L'opérateur dynamic_cast revient à zéro (0) lorsque je demande à un pointeur qui pointe vers une instance d'un objet hérité se multiplient. Je ne comprends pas pourquoi.

La hiérarchie:

class Field_Interface
{
  public:
    virtual const std::string get_field_name(void) const = 0; // Just to make the class abstract.
};


class Record_ID_Interface
{
  public:
    virtual bool has_valid_id(void) const = 0;
};


class Record_ID_As_Field
: public Field_Interface,
  public Record_ID_Interface
{
// This class behaves as a Field and a Record_ID.
// ...
}


// A demonstration function
void Print_Field_Name(const Field_Interface * p_field)
{
  if (p_field)
  {
    cout << p_field->get_field_name() << endl;
  }
  return;
}


// A main function for demonstration
int main(void)
{
  Record_ID_As_Field *  p_record_id = 0;
  p_record_id = new Record_ID_As_Field;
  if (p_record_id)
  {
     // (1) This is the trouble line
     Print_Field_Name(dynamic_cast<Field_Interface *>(p_record_id));
  }
  return 0;
}

Je veux avoir le Record_ID_As_Field à traiter comme Field_Interface, mais s'adapter aussi où Record_ID_Interface sont obligatoires.

Pourquoi est-dynamic_cast dans (1) ci-dessus 0 retour, et comment puis-je résoudre ce problème?

Je suis l'aide de Visual Studion 2008 sous Windows XP.

Remarque: Pour simplifier, j'utilise des pointeurs fondamentaux dans cet exemple. Code réel usages boost::shared_ptr.

Était-ce utile?

La solution

  

Remarque: Pour simplifier, j'utilise des pointeurs fondamentaux dans cet exemple. code réel utilise boost::shared_ptr.

Et voilà votre problème là. Vous ne pouvez pas dynamic_cast un shared_ptr<A> à un shared_ptr<B> puisque ces deux types ne sont pas réellement liés les uns aux autres, même si A et B sont

Heureusement, dans le cas spécifique dans votre question le dynamic_cast ne devrait pas être nécessaire, puisque Record_ID_As_Field* devrait être convertible implicitement à un Field_Interface* (puisque la dérive de l'autre). shared_ptr met en œuvre des opérateurs de conversion qui soulèvent ces conversions implicites aux objets shared_ptr respectifs, donc shared_ptr<Record_ID_As_Field> devrait être implicitement convertible en shared_ptr<Field_Interface>.

Si vous quittez le dynamic_cast, il devrait fonctionner.

Si vous souhaitez réellement besoin de faire un casting dynamique, vous pouvez utiliser un constructeur spécial fournies par shared_ptr:

shared_ptr<Record_ID_As_Field> raf;
shared_ptr<Field_Interface> fi(raf, dynamic_cast<FieldInterface*>(raf.get());

(je ne sais pas ce qui se passerait s'il le dynamic_cast échoue, vous devriez donc enquêter sur ce qui est la meilleure façon de gérer cette situation.)

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