Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

c++ шаблоны и абстрактные классы

84K
05 августа 2012 года
soumynona
1 / / 05.08.2012
Можно ли в с++ сделать такой шаблон, чтобы его можно было использовать только с классами, наследующими определнный абстрактный класс
допустим, мой код выглядит примерно так:

Код:
class Abstract
{
    virtual int getValue() = 0;
}

class Concrete1 : public Abstract
{
    int getValue()
    {
        //вычисления
    }
}

class Concrete2: public Abstract
{
    int getValue()
    {
        //вычисления
    }
}

class Container
{
    std::vector<Abstract*> _objects;
public:
    void push(Abstract *obj)
    {
        if(obj->getValue > SOME_VALUE)
        {
            _objects.push_back(obj);
        }
    }
    Abstract* pop()
    {
        //еще код
    }

    std::vector<Abstract*> getByvalue(int val)
    {
        //формирование нового вектора на основе условий и его возврат
    }
}
Идея в том, чтобы сделать класс Container шаблоном, т.е. удобно работать с ним было бы как-то так: Container<Concrete1> cont1 и добавлять значения типа Concrete1 и чтобы он возвращал вектор std::vectror<Concrete1*>. Как это сделать мне примерно понятно, но очевидно что класс Container может работать только с наследниками класса Abstract, т.к. он обращается в том числе к его виртуальным методам. Как описать шаблон правильно и красиво?

ps.я только начал изучать c++, отсюда и такие может быть очевидные вопросы.
412
07 августа 2012 года
grgdvo
323 / / 04.07.2007
Мне кажется, что вы хотите усложнить задачу.
У вас есть абстрактный класс, у вас есть контейнер для абстрактного класса, внутри которого вы используете интерфейс этого абстрактного класса. Зачем шаблон? Сделайте необходимые методы виртуальными и все - будет контейнер для абстрактного класса и всех его конкретных наследников.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог