2013-04-01 84 views
0
#include <iostream> 

class EquationOfMotion 
{ 
    public: 
     // other attributes 
     virtual void findNextTimeStep() = 0; 
}; 

class SystemModel 
{ 
    public: 
     EquationOfMotion* p_eom; 
     // other atributes 
     SystemModel(EquationOfMotion* new_p_eom) 
     { 
      p_eom = new_p_eom; 
     } 
}; 

class VehicleEquationOfMotion: public EquationOfMotion 
{ 
    public: 
     VehicleEquationOfMotion(...){/* initialise attribute*/} 
     virtual void findNextTimeStep(){} 
}; 

class Vehicle: public SystemModel 
{ 
// ???? Implementation ????? 
} 

VehicleSystemModel一個特例,其中p_eomVehicleEquationOfMotion繼承,指針和軟件架構

我想初始化一個VehicleEquationOfMotion的實例並指向p_eomVehicle。我希望它只在Vehicle的範圍內定義,同時不要使用堆。 是否有可能在不使用堆的情況下在Vehicle內駐留VehicleEquationOfMotion對象? (如果沒有,請建議設計出錯的地方)。

可能會有所幫助:我想過在this問題的實現,但遇到了麻煩(見問題)。

+2

我不明白你的問題。 –

+0

是的,聲明一個BarChild類型的成員。你有什麼確切的問題? –

+0

@KirilKirov澄清了這個問題,請讓我知道如果仍然不清楚 – aiao

回答

0

如果您希望讓FooParent.p_barPar指向駐留在FooChild中的BarChild,那麼您可能需要將默認ctor添加到FooParent中,並且還需要使用以下方法:set_p_barPar(BarChild* new_p_bar){p_barPar = new_p_bar;}。所以,你得到:

class FooParent 
{ 
    public: 
     BarParent* p_barPar; 
     FooParent(){} 
     FooParent (BarChild* new_p_bar) 
     { 
      p_barPar = new_p_bar; 
      std::cout << p_barPar->x << std::endl; 
     } 
    protected: 
     set_p_barPar(BarChild* new_p_bar) 
     { 
      p_barPar = new_p_bar; 
     } 
} 

然後你就可以實現FooChild:

class FooChild : public FooParent 
{ 
    public: 
      FooChild(int new_x, BarChild* new_p_bar):_bar_child(new_x) 
      { 
       set_p_barPar(&_bar_child); 
      } 

    private:  //? Depends on your plans 
     BarChild _bar_child(); 
} 
1

如果我正確了你的問題,然後再去做這樣的:

class FooChild : public FooParent 
    { 
    public: 
     FooChild (int pX):m_BarChild(pX), FooParent(&m_BarChild) // point p_barPar to instance of BarChild (i.e. m_BarChild) 
     { 
     } 
    private: 
     BarChild m_BarChild; // instance of BarChild resided in the stack(not the heap) and is local to FooChild 
    } 
+0

切片問題呢? – aiao

+0

這裏沒有切片問題,因爲你的p_barPar是一個指向BarParent而不是一個實例的指針,所以在這裏,我們讓BarParent的p_barPar指向FooChild的m_BarChild的地址 – TravellingGeek

+0

當我們將m_BarChild指定給一個實例BarParent(不是指針)。例如:如果p_barPar是一個不是指針的實例 – TravellingGeek

0

使用類模板。

class EquationOfMotion { ... }; 

template <typename EOM> 
class SystemDynamics 
{ 
    EOM EquationOfMotion; 
    ... 
}; 

class VehicleEquationOfMotion : public EquationOfMotion { ... }; 

class Vehicle : public SystemDynamics<VehicleEquationOfMotion> { ... }; 
0

可能這是你想要的。但設計並不安全。您正在將指針傳遞給未初始化的對象。

class Vehicle: public SystemModel 
{ 
public: 
    Vehicle(): SystemModel(&_vem) 
    { 

    } 

    VehicleEquationOfMotion _vem; 
} 

但是,它是安全做到以下幾點:

class SystemModel 
{ 
    public: 
     EquationOfMotion* p_eom; 
     // other atributes 
     SystemModel() 
     { 
     } 
}; 

class Vehicle: public SystemModel 
{ 
    public: 
    Vehicle(): SystemModel(&_vem) 
    { 
     p_eom = &_vem; 
    } 
    VehicleEquationOfMotion _vem; 
};