قم بإنشاء مثيل فئة مشتق من مثيل فئة أساسية دون معرفة أعضاء الفصل
-
23-09-2019 - |
سؤال
هل هذا السيناريو ممكن؟
class Base
{
int someBaseMemer;
};
template<class T>
class Derived : public T
{
int someNonBaseMemer;
Derived(T* baseInstance);
};
هدف:
Base* pBase = new Base();
pBase->someBaseMemer = 123; // Some value set
Derived<Base>* pDerived = new Derived<Base>(pBase);
يجب أن تكون قيمة prodived-> somebasememer متدربة إلى pbase-> somebasemmed وتشابه مع أعضاء الأساس الآخرين.
المحلول
لماذا لا تنتهي فعليًا من الكتابة وتجميع الرمز؟
class Base
{
public: // add this
int someBaseMemer;
};
template<class T>
class Derived : public T
{
public: // add this
int someNonBaseMemer;
Derived(T* baseInstance)
: T(*baseInstance) // add this
{ return; } // add this
};
هذا يجمع ويدير كما حددت.
تحرير: أو تقصد ذلك someNonBaseMemer
يجب أن تساوي someBaseMemer
?
نصائح أخرى
لماذا تريد استخلاص المؤشر الأساسي وتمريره في نفس الوقت؟ اختر إما ، لا شيء يمنعك من وجود كليهما. استخدم الميراث للقيام بالوظيفة لك:
class Base
{
public:
Base(int x) : someBaseMemer(x) {}
protected: // at least, otherwise, derived can't access this member
int someBaseMemer;
};
template<class T>
class Derived : public T
{
int someNonBaseMemer;
public:
Derived(int x, int y) : someNonBaseMemer(y), T(x) {}
};
Derived<Base> d(42, 32); // usage
وإن لم يكن أفضل الخيارات كتصميم.
يعلن someBaseMemr
كجمهور أو تغيير الإعلان من class
ل struct
:
class Base
{
public:
int someBaseMemer;
};
OR
struct Base
{
int someBaseMemr;
};
تذكر أن أ class
لديها private
الوصول إلى جميع الأعضاء والأساليب افتراضيًا. أ struct
يوفر public
الوصول افتراضيا.
أيضا ، يجب أن يكون لجميع الفصول المشتقة public
الميراث من Base
.
لا تنتمي إلى StackOverflow