我希望在基类A中,对派生类中的指针引用(或指针,如果不可能)。 这看起来像这样:
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;
}
,数据类为:
BaseDataClass
{
void doSomething();
}
DerivedDataClassA : public BaseDataClass
{
//...
}
DerivedDataClassB : public BaseDataClass
{
//...
}
接下来我想在BaseClassController中做的是:
BaseClassController::someFunction(){
m_current->doSomething();
}
问题是m_currentA和m_currentB指向的对象在程序的生命周期中会发生很大的变化,我希望m_current引用在派生类指针发生变化时自动更改。 具体来说,我希望更改m_currentA指向的对象的函数看起来像这样:
DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){
m_currentA = ptA;
}
而不是这样:
DerivedClassAController::changerCurrentA(DerivedDataClassA* ptA){
m_currentA = ptA;
m_current = ptA;
}
我尝试通过在派生类构造函数中传递指针:
BaseClassController::BaseClassController(BaseDataClass* pt)
: m_current(pt)
{
}
DerivedClassAController::DerivedClassAController()
: BaseClassController(m_currentA),
m_current(A)
{
}
但我最终在DerivedClassAController中有一个指向DerivedDataClassB的m_current。
这是否适合?或者有更好的方法吗?
注意: DerivedClassAController将95%的时间使用m_currentA作为DerivedDataClassA。仅使用基类中的m_current指针将结束将dynamic_cast(m_current)放在任何地方。
答案 0 :(得分:1)
我认为以下方法可行:不使用成员引用,而是在BaseClassController
中创建一个返回指针副本的虚函数:
struct BaseClassController {
virtual BaseDataClass* m_current() = 0;
在每个派生控制器中以不同方式实现它:
BaseDataClass* DerivedDataClassA::m_current() {
return m_currentA;