قم بإنشاء مثيل فئة مشتق من مثيل فئة أساسية دون معرفة أعضاء الفصل

StackOverflow https://stackoverflow.com/questions/2344910

سؤال

هل هذا السيناريو ممكن؟

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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top