У меня проблема с некоторыми рефакторингами, которые я пытаюсь сделать. У нас много дублирования кода, и я пытаюсь разобраться в этом. У меня есть следующая структура классовРефакторинг с использованием абстрактных базовых классов и шаблонов в C++
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
другу и как реализовать это в общем виде. Раньше этот класс работал только с типами ModelM0
, которые не наследовали от ModelBase
. Теперь другие модели также наследуют от 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)
я могу создать правильныйTModel
используяmake
в выше - мне нужен завод и как это будет реализовано?В
ModelBase.h
классEM
указан как класс друга. Как это может быть сделано мной для работы с используемым типомTModel
(ModelBase
)?
Важно отметить, что это рефакторинг вопрос, не является ли или-не код, который я показал в методах является правильным или правильным (это было вырубать, чтобы кратко выделить мои проблемы). Рефакторинг - единственное, с чем мне хотелось бы помочь. Большое спасибо за ваше время.
Да, потому что код не компилируется. Обзор кода предназначен только для рабочих примеров ... – MoonKnight
'Мне нужна фабрика и как это будет реализовано?' Обычно шаблон фабрики рассматривается, когда созданный объект состоит из общих частей, которые могут объединять конструкцию заданной функциональности объекта ... –
Пожалуйста, добавьте ошибку (-ы) компилятора. – grek40