Я пытаюсь создать вектор (или любой контейнер STL, на самом деле), который может содержать набор различных объектов, которые являются подклассами одного определенного типа. Проблема в том, что мой базовый класс настроен по шаблону.
Из того, что я могу сказать, я должен создать интерфейс / абстрактный супер базовый класс (не уверен, что является предпочтительной терминологией C ++). Я бы предпочел не делать этого, а просто использовать мой (шаблонный) абстрактный базовый класс. Ниже приведен пример кода.
В принципе, есть ли способ не требовать WidgetInterface
? Как сказать компилятору игнорировать требования шаблона? Если у меня должно быть WidgetInterface
, правильно ли я иду со следующим?
#include <vector>
#include "stdio.h"
enum SomeEnum{
LOW = 0,
HIGH = 112358
};
// Would like to remove this WidgetInterface
class WidgetInterface{
public:
// have to define this so we can call it while iterating
// (would remove from Widget if ended up using this SuperWidget
// non-template baseclass method)
virtual void method() = 0;
};
template <class TDataType>
class AbstractWidget : public WidgetInterface{
public:
TDataType mData;
virtual void method() = 0;
// ... bunch of helper methods etc
};
class EnumWidget : public AbstractWidget<SomeEnum>{
public:
EnumWidget(){
mData = HIGH;
}
void method(){
printf("%d\n", mData); // sprintf for simplicity
}
};
class IntWidget : public AbstractWidget<int>{
public:
IntWidget(){
mData = -1;
}
void method(){
printf("%d\n", mData); // sprintf for simplicity
}
};
int main(){
// this compiles but isn't a workable solution, not generic enough
std::vector< AbstractWidget<int>* > widgets1;
// only way to do store abitary subclasses?
std::vector<WidgetInterface*> widgets2;
widgets2.push_back(new EnumWidget());
widgets2.push_back(new IntWidget());
for(std::vector<WidgetInterface*>::iterator iter = widgets2.begin();
iter != widgets2.end(); iter++){
(*iter)->method();
}
// This is what i'd _like_ to do, without needing WidgetInterface
// std::vector< AbstractWidget* > widgets3;
return 0;
}