mardi 26 juillet 2016

Base Class reference to Pointer of Derived Class

I would like to have, in a base class A, a reference (or pointer if not possible) to a pointer in a derived class. This would look like this :

 BaseClassController
        {
          public :
            //Constructors, destructor,...

          protected :
            BaseDataClass *& m_current;
        }

DerivedClassAController : public BaseClassController
    {
      public :
        //Constructors, destructor,...

      protected :
        DerivedDataClassA * m_currentA;
    }

DerivedClassBController : public BaseClassController
    {
      public :
        //Constructors, destructor,...

      protected :
        DerivedDataClassB * m_currentB;
    }

with the Data classes being :

BaseDataClass
{
    void doSomething();
}

DerivedDataClassA : public BaseDataClass
{
 //...
}

DerivedDataClassB : public BaseDataClass
{
 //...
}

What I would like to do next in BaseClassController is :

BaseClassController::someFunction(){
    m_current->doSomething();
}

The problem is that the objects pointed by m_currentA and m_currentB will change a lot through the life of the program, and I would like the m_current reference to change automatically when the derived class pointer changes. Concretly, I would like the function changing the object pointed by m_currentA to look like this :

DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){
   m_currentA = ptA;
}

and not like this :

DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){
   m_currentA = ptA;
   m_current = ptA;
}

I tried by passing the pointer in the derived class constructor :

BaseClassController::BaseClassController(BaseDataClass* pt)
 : m_current(pt)
{
}

DerivedClassAController::DerivedClassAController()
 : BaseClassController(m_currentA),
   m_current(A)
{
}

But I ended up having a m_current pointing to a DerivedDataClassB in DerivedClassAController.

Is this acheivable ? Or is there a better way to do that ?

Note : DerivedClassAController will use m_currentA as a DerivedDataClassA 95% of the time. Using only the m_current pointer in the base class will end putting dynamic_cast(m_current) everywhere.

Aucun commentaire:

Enregistrer un commentaire