私が試しているリファクタリングに問題があります。私たちは多くのコードの複製を持っており、これを整理しようとしています。私は、次のクラス構造に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
の実装が正しくないと、私は以下の本について尋ねます。 ModelM0.cppで
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);
};
として実装::私は、/はModelBase
から継承実装するクラス、ModelM0.hを持って
ModelM0::ModelM0(Tag a) : ModelBase(a) { }
void ModelM0::calculate(double lambda)
{
// Do stuff.
}
問題がEM
友人のクラスであり、これを一般的な方法で実装する方法。これまでは、このクラスはModelBase
から継承しなかったタイプModelM0
でのみ動作しました。今では他のモデルもModelBase
とEM
から継承する必要があります。これも問題になります。 EM.hで
として:私は(私は、我々はTModel
を使用しているModelBase
の種類を指定することができ、テンプレートに変更されている)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);
}
問題の実装では、我々は上記のは大丈夫であるように思わ
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);
}
}
を持ってEM.cpp
で、EM::Bucket& getModel(int ag);
で、私の問題があります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