2013-05-04 14 views
5

Bu kod neden çalışmıyor?dynamic_pointer_cast Kullanıldığında Dinamik Döndü Edilemiyor

std::shared_ptr<Event> e = ep->pop(); 
std::shared_ptr<TrackerEvent> t; 

t = std::dynamic_pointer_cast<TrackerEvent>(e); 

aşağıdaki hatayı alıyorum: Event den

/usr/include/c++/4.6/bits/shared_ptr.h:386: error: cannot dynamic_cast '(& __r)->std::shared_ptr<Event>::<anonymous>.std::__shared_ptr<_Tp, _Lp>::get [with _Tp = Event, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]()' (of type 'class Event*') to type 'class TrackerEvent*' (source type is not polymorphic) 

TrackerEvent devralır bu yüzden sorun bu yönde döküm olamaz sanırım. Ancak ep->pop(), Event veya TrackerEvent türünde bir nesneyi döndürebilir. Ve ben ... Ben TrackerEvent için döküm deneyin ve NULL döndüğünde ben bir Event veya TrackerEvent olup olmadığını bildiğim umuyordum

Bunu nasıl yapardın?

+3

Sen gerek dynmaic_cast'i kullanmak için en az bir sanal yönteme sahip olmak. – stardust

cevap

10

derleyici mesajın sonunda neler olduğunu anlatıyor Dinamik yayınlara izin vermek için sipariş verin. Sanal Event ait yıkıcı yapabilir:

İşte
class Event 
{ 
public: 
    virtual ~Event() { /* whatever goes here, or nothing... */ } 
    // ... 
}; 

kod derlenir (sanal yıkıcı çıkarmadan bir derleme hatası similar to the one you are seeing neden olur) gittiğine işaret eden live example with polymorphic types olduğunu. (Sizin derleyici bu konuda C++ 11-uyumlu ise) gibi doğru yorumlarda Luc Danton bahsettiği

, sanal bir yıkıcı bir temerrüde sürümü bu şekilde tanımlanabilir:

class Event 
{ 
public: 
    virtual ~Event() = default; 
    // ... 
}; 
+0

@LucDanton: Doğru, bundan bahsetmeyi unuttum. Düzenlendi, teşekkürler –

3

dynamic_cast gerçekleştirmek için, aldığınız tür polimorfik olmalıdır. Bunun doğru olması için, bazı sanal üyelere sahip olmalı ya da miras almalı. Event'un bir sanal üye işlevine sahip olduğundan emin olun (en azından bir sanal yıkıcı). içinde (yani bir polimorfik tip olmak)

(source type is not polymorphic)

Sizin Event taban sınıfı en az bir virtual üye işlevine sahip olması gerekir: