【问题标题】:Base Class reference to Pointer of Derived Class基类对派生类指针的引用
【发布时间】:2016-07-26 13:16:54
【问题描述】:

我希望在基类 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)
{
}

但我最终得到了一个 m_current 指向 DerivedClassAController 中的 DerivedDataClassB。

这可以实现吗?或者有更好的方法吗?

注意: DerivedClassAController 将在 95% 的时间内使用 m_currentA 作为 DerivedDataClassA。仅在基类中使用 m_current 指针将结束将 dynamic_cast(m_current) 放在任何地方。

【问题讨论】:

  • polymorphism - 你试过了吗?你能通过m_current指针做你需要的一切吗?
  • virtual BaseDataClass* GetCurrent() = 0; in BaseClassController,并让两个派生控制器实现它并分别返回m_currentAm_currentB的当前值。
  • LogicStuff - 我添加了一条注释来解释为什么我不能像你建议的那样做。伊戈尔 - 可以的,是的!我会尝试。但我也想知道它是否可以按照我尝试的方式工作
  • 如您的示例中所写,BaseClassController 构造函数将引用绑定到局部变量 ptm_currentA 的副本)。一旦构造函数返回,引用就会变得悬空。
  • 没想到...怎么通过呢?

标签: c++ c++11 polymorphism


【解决方案1】:

我认为以下方法可行:不使用成员引用,而是在 BaseClassController 中创建一个返回指针副本的虚函数:

struct BaseClassController {
    virtual BaseDataClass* m_current() = 0;

并在每个派生控制器中以不同方式实现它:

BaseDataClass* DerivedDataClassA::m_current() {
    return m_currentA;

【讨论】:

  • ... 并且,我建议尽可能将需要使用该指针的代码放在对象本身内部中,或者它的父级,因此根本不需要返回指针。这样,“我不必跑遍应用程序的源代码”来发现特定事物被操纵的所有方式。没关系。”如果(或者更确切地说,何时)需要更改某些内容,则只需“更改一次,就在此处”。
  • 这是我尽可能做的事情。开发的应用程序是使用大量 MVC 设计模式的 CAD。控制器通过指针操作数据类,但程序的其余部分调用控制器的函数。指针不会远离控制器类及其基类。
猜你喜欢
  • 2014-06-16
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多