recursive template idiom을 사용하여 팩토리에서 기본 클래스의 모든 자식을 자동으로 등록합니다. 그러나 내 디자인에서 자식 클래스 친구 클래스로 기본 클래스가 있어야합니다. 팩토리를 통하는 것이 아니라이 클래스의 인스턴스 생성을 피하기 위해, Base 클래스의 생성자가 private이어야한다.재귀 템플릿 관용구 기본 클래스가 자식 클래스의 친구가되는 것을 피하는 방법
과도한 목표는 공장 등록이 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를 추가해야하는 것을 싫어하지만, 나는 을 가지고 있지 않다.은 public이 될 생성자와 정적 멤버 이름이 필요하다.
더 좋은 해결책이나 더 나은 레이아웃이 없습니까?
왜 BaseSolver가 친구 클래스 여야합니까? BaseSolver에'friend class T'를 대신 추가 할 수 있습니까? –
어떻게하면 BaseSolver의 private 메소드에 액세스하고 싶지는 않지만 BaseSolver는 Solver의 private 멤버에 액세스해야합니다. – tune2fs
나는이 디자인이있는 방식을 좋아합니다. 왜 '친구'선언이 문제가됩니까? – aschepler