Я пропускаю что-то очевидное, но вот моя проблема
с чистым абстрактным классом IFoo
class IFoo
{
public:
virtual bool isBar1() const=0;
virtual bool isBar2() const=0;
};
и 2 реализациями
class Foo1 : public IFoo
{
public:
bool isBar1() const override { return true;}
bool isBar2() const override { return false;}
};
class Foo2 : public IFoo
{
public:
bool isBar1() const override { return false;}
bool isBar2() const override { return true;}
};
I есть управляющий класс, который должен вызывать правильный метод в зависимости от переменной protocol
class FooManager : public IFoo
{
public:
bool isBar1() const override
{
switch(protocol)
{
case 1: return Foo1().isBar1();
case 2: return Foo2().isBar1();
default: return false;
}
}
bool isBar2() const override
{
switch(protocol)
{
case 1: return Foo1().isBar2();
case 2: return Foo2().isBar2();
default: return false;
}
}
void setProtocol(int proto){this->protocol = proto;}
private:
int protocol{0};
};
Но есть куча методов, и я не хочу помещать switch(protocol)
везде, учитывая, что это действительно Повторяющийся и новый FooX может быть добавлен в любое время.
Как я могу вызвать правильное переопределение без использования шаблонов (при условии, что протокол является динамическим c, а FooManager постоянен) и без использования кучи при каждом вызове (через умный указатель или лайки, потому что это для встроенного проекта, в котором мы стараемся как можно больше оставаться в стеке.
Я не могу просто создать метод getFoo (), который возвращает IFoo, потому что это абстрактный класс И я не могу вернуть IFoo & ни того, ни другого, потому что он вернет ссылку на временный.
IFoo& FooManager::getFoo()
{
switch(protocol)
{
case 1: return Foo1();
case 2:
default: return Foo2();
}
//return reference to temporary
}
Что еще я могу сделать?