【发布时间】:2017-01-11 09:41:46
【问题描述】:
我在尝试进行一些重构时遇到问题。我们有很多代码重复,我正在尝试解决这个问题。我有以下类结构
IMessageSink.h:
class IMessageSink
{
public:
virtual ~IMessageSink() { };
virtual void process(const taurus::Msg& msg) = 0;
};
我有以下所有模型必须继承的基类 ModelBase.h,此时请不要使用friend class EM:
class ModelBase : public virtual IMessageSink
{
public:
ModelBase(Tag a);
void process(const taurus::Msg& msg);
void reset();
private:
friend class EM; // I will ask about this below.
virtual void calculate(double lambda) = 0;
};
friend EM 的实现不正确,我在下面问这个问题。然后我有一个从ModelBase,ModelM0.h实现/继承的类:
class ModelM0 : public virtual ModelBase
{
public:
ModelM0(Tag a);
static ModelM0* ModelM0::make(Tag a)
{
ModelM0* m = new ModelM0(a);
m->reset();
return m;
}
private:
void calculate(double lambda);
};
ModelM0.cpp 实现为:
ModelM0::ModelM0(Tag a) : ModelBase(a) { }
void ModelM0::calculate(double lambda)
{
// Do stuff.
}
问题在于EM 朋友类以及如何以通用方式实现它。以前,此类仅适用于不继承自 ModelBase 的类型 ModelM0。现在其他模型也继承自 ModelBase 和 EM 也需要与这些一起工作 - 这就是问题所在。我在 EM.h 中有以下定义(我已将其更改为模板,因此我们可以指定我们使用的ModelBase 的类型TModel):
EM.h 为:
template <class TModel>
class EM : public virtual IMessageSink
{
public:
static EM* make(Tag a)
{
return new EM(a);
}
EM(Tag a);
~EM();
void process(const taurus::Msg& msg);
void run();
private:
struct Bucket
{
TModel* _model;
std::vector<TinyMatrix<1, 1> > _obs
};
EM::Bucket& getModel(int ag);
}
问题实现是EM::Bucket& getModel(int ag);,在EM.cpp我们有
template<class TModel>
EM<TModel>::EM(Tag a) { }
template<class TModel>
EM<TModel>::~EM()
{
run();
}
template<class TModel>
void EM<TModel>::process(const taurus::Msg& msg)
{
int ag = getMessageCount(msg.type()); // External call.
if (ag <= 3)
{
Bucket& b = getModel(ag);
TModel* m = b._model;
m->process(msg);
}
}
上面好像还可以,我的问题是getModel的实现
template<class TModel>
EM<TModel>::Bucket& EM<TModel>::getModel(int ag)
{
// This is not right.
TModel* m;
m = TModel::make(getTag(ag)); // This is not right - I need a factory.
// ... Do stuff.
Bucket& b = // Get a bucket.
b._model = m;
return b;
}
我的问题:
如何更改上面的代码,以便在
EM<TModel>::getModel(int ag)中我可以使用上面的make创建正确的TModel- 我需要一个工厂吗?这将如何实现?在
ModelBase.h中,EM类被指定为朋友类。我怎样才能使这个泛型与正在使用的TModel(ModelBase) 类型一起使用?
这里需要注意的是,这是一个重构问题,而不是我在方法中显示的代码是否正确或正确(为了简洁地突出我的问题,已将其删减)。重构是我唯一需要帮助的事情。非常感谢您的宝贵时间。
【问题讨论】:
-
是的,因为代码无法编译。代码审查仅适用于工作示例...
-
do I need a factory and how would this be implemented?工厂模式通常在创建的对象由通用部分组成时被考虑,这些通用部分可以耦合在一起构造给定的对象功能...... -
请添加编译器错误。
标签: c++ templates inheritance refactoring class-design