Boost :: shared_ptr و Dynamic Cast
-
28-09-2019 - |
سؤال
لدي مشكلة باستخدام أ shared_ptr
من فئة أساسية ، لا يمكنني أن أكون قادرًا على استدعاء أساليب الفئة المشتقة عند إلحاقها. أعتقد أن الكود سيكون أكثر مطوّلة مني:
class Base : public boost::enable_shared_from_this<Base>
{
public:
typedef boost::shared_ptr<BabelNet> pointer;
};
class Derived : public Base
{
public:
static pointer create()
{
return pointer(new Derived);
}
void anyMethod()
{
Base::pointer foo = Derived::create();
// I can't call any method of Derived with foo
// How can I manage to do this ?
// is dynamic_cast a valid answer ?
foo->derivedMethod(); // -> compilation fail
}
};
المحلول
نرى Static_cast مع Boost :: shared_ptr؟
ستحتاج إلى استخدام Dynamic_pointer_cast للحصول على ما هو مناسب shared_ptr
مثيل. (المقابلة ل dynamic_cast
)
نصائح أخرى
مشترك مؤشر أم لا ، عندما يكون لديك مؤشر إلى Base
, ، يمكنك فقط استدعاء وظائف الأعضاء من Base
.
إذا كنت بحاجة حقا dynamic_cast
, ، يمكنك استخدام dynamic_pointer_cast
من تعزيز, ، لكن من المحتمل أن لا ينبغي عليك ذلك. بدلاً من ذلك ، فكر في تصميمك: Derived
هو Base
, ، وهذه علاقة قوية للغاية ، لذا فكر بعناية Base
واجهة وإذا كان النوع الخرساني يجب أن يكون معروفًا حقًا.
إذا لم يتم الإعلان عن DerivedMethod في فئة قاعدة (افتراضية أم لا) ، فمن الطبيعي أن تفشل التجميع. يعرف PTR المشترك ويستخدم الفئة الأساسية (من خلال المؤشر الذي يحمله) ، ولا يعرف شيئًا عن الفئة المشتقة وطرقه المحددة.
الكود الخاص بك لن يعمل حتى مع المؤشرات الخام.
تحتاج إما للإعلان derivedMethod()
الطريقة حتى في الفئة الأساسية أو أن يكون لديك مؤشر إلىDerived
هدف.