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 ?????
}

VehicleSystemModelwherep_eom指向 的特化VehicleEquationOfMotion

我想初始化一个实例VehicleEquationOfMotion并指向它p_eomVehicle我希望它只在 的范围内定义Vehicle,同时不使用堆。甚至可以在不使用堆的情况下将VehicleEquationOfMotion对象驻留在里面吗?Vehicle(如果不是,请提出设计错误的地方)。

可能会有所帮助:我考虑过这个问题中的实现,但遇到了麻烦(见问题)。

4

4 回答 4

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
  }
于 2013-04-01T13:31:13.507 回答
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;
};
于 2013-04-01T15:35:56.177 回答
0

使用类模板。

class EquationOfMotion { ... };

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

class VehicleEquationOfMotion : public EquationOfMotion { ... };

class Vehicle : public SystemDynamics<VehicleEquationOfMotion> { ... };
于 2013-04-01T14:18:02.687 回答
0

如果您想让 FooParent.p_barPar 指向位于 FooChild 内的 BarChild,您可能需要向 FooParent 添加一个默认 ctor 和一个方法,如下所示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();
}
于 2013-04-01T13:22:22.513 回答