2
我使用recursive template idiom來自動在工廠中註冊基類的所有子類。但是在我的設計中,子類必須具有基類的朋友類。由於我的基類的構造函數應該是私有的,以避免通過工廠以外的類實例化。遞歸模板成語如何避免基類是子類的朋友
總體目標是在BaseSolver中完成工廠註冊,並且ChildClasses不能通過工廠實例化。
這裏是我的基類的代碼,它會自動註冊SolverFactory中的所有子代。
template<class T>
struct BaseSolver: AbstractSolver
{
protected:
BaseSolver()
{
reg=reg;//force specialization
}
virtual ~BaseSolver(){}
/**
* create Static constructor.
*/
static AbstractSolver* create()
{
return new T;
}
static bool reg;
/**
* init Registers the class in the Solver Factory
*/
static bool init()
{
SolverFactory::instance().registerType(T::name, BaseSolver::create);
return true;
}
};
template<class T>
bool BaseSolver<T>::reg = BaseSolver<T>::init();
在這裏,我的子類的頭文件:
class SolverD2Q5 : public BaseSolver<SolverD2Q5>{
private:
//how can I avoid this?
friend class BaseSolver;
SolverD2Q5();
static const std::string name;
}
這工作得很好。不過,我真的不喜歡將BaseSolver添加爲朋友類,但我不要希望構造函數和靜態成員名稱是公開的。
有沒有更優雅的解決方案或更好的佈局來避免這種情況?
爲什麼BaseSolver需要成爲朋友類?你可以添加'朋友類T'到BaseSolver嗎? –
這應該如何幫助我不想訪問BaseSolver中的私有方法,但BaseSolver應該訪問Solver的私有成員。 – tune2fs
我喜歡這種設計。爲什麼'朋友'聲明是一個問題? – aschepler