Я хочу иметь иерархию классов и иметь возможность создавать объекты из нее только внутри Factory.
Пример:
class Base
{
protected:
Base(){};
virtual void Init(){};
friend class Factory;
};
class SomeClass : public Base
{
public://I want protected here! Now it possible to call new SomeClass from anywhere!
SomeClass(){};
void Init(){};
};
class Factory
{
public:
template<class T>
T* Get()
{
T* obj = new T();
obj->Init();
return obj;
}
};
int main()
{
Factory factory;
SomeClass *obj = factory.Get<SomeClass>();
}
Моя проблема в том, что я хочу иметь возможность создавать объекты только из Factory, но я не хочу объявлять friend class Factory
в каждом классе, производном от Base.
Есть ли способ распространять друга в производных классах? Есть ли другой способ добиться такого поведения?