Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Наследование и STL


Автор: bel_nikita 8.1.2004, 12:38
Возможно ли наследовать STL классыconfused.gif

хотелась бы следующая конструкция:

template <typename T>
class cSTLQueue: public std::queue
{
public:
...
protected:
....
private:
....
};

А вообще-то мне надо queue, но с фиксным колвом элементов и чтоб память выделялась сразу на конкретное число элементов.
Хочу применить resize к queue, но надо как-то добраться до protected. Выходит нужно использовать наслкдование, но возможно ли такое?

Автор: Hroft 8.1.2004, 13:36
А что, так разве не работает?
Код

#include <queue>
#include <iostream>

using namespace std;

template <class T>
class static_queue : public queue<T> {
private:
void my_resize() { this->push('A'); }
public:
static_queue() : queue<T>() {my_resize();}
};

int main(int argc, char* argv[])
{
static_queue<char> sq;
//sq.pop();
std::cout<<sq.empty();
return 0;
}

А resize в нем нету....

Автор: a-petrosian 8.1.2004, 13:50
В общем наследование STL контейнеров не самый лучший вариант.

Если ты не находишь другого выхода из сложивщейся ситуации, то проблема может быть гараздо глубже, а именно в проектных решениях. Подумай, что значит "очередь с фиксированным количестеом элементов"? ? ? Очередь - это структура данных в которую элементы добавляются и удаляются последователно !

Может быть тебе нужен vector<> или может нужно создать класс инкапсулирующий работу с
queue<>.

Автор: bel_nikita 8.1.2004, 14:52
to a-petrosian
Цитата
Подумай, что значит "очередь с фиксированным количестеом элементов"? ? ? Очередь - это структура данных в которую элементы добавляются и удаляются последователно !


я не правильно выразился, не количество элементов, а количество ячеек элементов
т.е. память под очередь должна выделяться при инициализации, а заполнение элементами по ходу программы

Hroft
я тож типа того пытался сделать, но ругается (MVC6++), типа посылает на доку к компилятору

Автор: Hroft 8.1.2004, 15:23
Интересно, я тоже под VCPP6.0 это компилировал.
Но можно так сделать: у вектора vector<> есть функция reserve, которая выделяет память, но при этом push_back будет работать, как будто она не выделялась. То есть не будет выделяться память под каждый элемент отдельно (или же под группу элементов, так как на самом деле оно не по одному выделяется, а штук по 10 по умолчанию, вроде бы).

Автор: bel_nikita 8.1.2004, 15:29
Hroft
спасибо!
я уже пошел по другому пути

а может проблема в typename? у тебя используется class
Хотя это вроде бы тоже самое, но мне кажется есть какие-то отличия между typename & class
жаль времени нет толком разобраться

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)