找到合适的设计方法

时间:2014-03-31 15:04:28

标签: c++ design-patterns

我在c ++中遇到了一些设计问题。 我的基本想法是:

我有一个州级和两个卡尔曼过滤器类。卡尔曼滤波器类具有相同的基类,具有相同的接口校正(状态,测量)。但每个实现都以不同的方式工作。

我的州级,基本上处理一个向量。

class StateBase{
protected:
  Eigen::VectorXd state_;
};

class StateCV : public StateBase {}
class StateCA : public StateBase {}

卡尔曼滤波器基类:

class KalmanBase {
public:
  virtual void prediction(Eigen::VectorXd& state)
  virtual void Correction(Eigen::VectorXd& state, Eigen::VectorXd& measurement) = 0;
 ...
};
  virtual StateBase* CreateState() = 0;

派生卡尔曼A类

class KalmanA : public KalmanBase {
public:
  void Prediction(Eigen::VectorXd& state) {
      state = A_ * state;
  void Correction(Eigen::VectorXd& state, Eigen::VectorXd& measurement) {
      ... 
      Eigen::VectorXd x = C_*state - measurement;
      ...
  }
protected:
  Eigen::MatrixXd A_, C_ ;
};

派生的KalmanB类

class KalmanB : public KalmanBase {
public:
  void Prediction(Eigen::VectorXd& state) {
    StateFunc(state);
  }
  void Correction(Eigen::VectorXd& state, Eigen::VectorXd& measurement) {
      ... 
      Eigen::VectorXd x = measurement - CFunc(state);
      ...
  }
private:
    void StateFunc(Eigen::VectorXd& state) {}
    CFunc(const Eigen::VectorXd& measurement) {}
};

我还为每种类型的状态都有KalmanA和KalmanB的子类。

class KalmanA_CV : public KalmanA {
  StateBase* CreateState() { return new StateCV(); }  
}
class KalmanA_CA : public KalmanA {
  StateBase* CreateState() { return new StateCA(); } 
}

class KalmanB_CV : public KalmanB { ...}
class KalmanB_CA : public KalmanB { ... }

根据我的测量结果,我必须更改KalmanA中的C_ Matrix或KalmanB中的CFunc,以将状态向量的维度映射到测量向量的维度。

所以从外面我只想定义测量类型和状态类型,并执行以下操作:

KalmanBase* Kalman
Kalman = new KalmanA_CV
state = Kalman.CreateState()
// Measurement1 m;
// m.initMeasurement(...)
Kalman.correction(*state, m)

并且根据测量类型,我希望kalmanA或KalmanB使用相应的C_矩阵或C_Function。

我很感激一些设计建议。

2 个答案:

答案 0 :(得分:1)

我并不确切地知道你是如何想象这一点的,但基本上这对于我猜的访客模式来说是一个很好的选择。如需粗略概述,请查看wikipedia page

答案 1 :(得分:0)

对于初学者来说,StateBase::state_似乎未被使用。有道理:它既不是卡尔曼的状态,也不是卡尔曼的状态。

其次,KalmanA只是KalmanB的专用版本。特别是, StateFunc[](Eigen::VectorXd& state) { state *= A_; }

因此,我建议你删除整个继承模型,然后用class Kalman创建一个std::function<void(Eigen::VectorXd& state)> StateFunc

最后一点,你正在使用new。这可以避免,只需直接使用变量:Kalman kal { A_matrix, C_matrix }; // Selects the right ctor overload