Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кллекция кнопочек :)) вообщем как это реализавать чере STL ? / 25 сообщений из 29, страница 1 из 2
03.02.2004, 16:03
    #32396893
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
Так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class cItem
{
  ...
};
class cItems :public std:vector<cItem*>
{
  ...
}

или так ?
Код: plaintext
1.
 std::vector<cItem*> cv;


да и еще вопрос
с вектором можно работать как с динамическим массивом ??
и как ? :)
____
...
Рейтинг: 0 / 0
03.02.2004, 16:05
    #32396899
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
наследовать от vector ничего не надо - это вообще бессмыслено так как там нету ни одной virtual функции :)

с вектором можно работать как с динамическим массивом ??

вот так
Код: plaintext
1.
2.
 std::vector<cItem*> cv;
 cv.insert( new cItem );
...
Рейтинг: 0 / 0
03.02.2004, 16:06
    #32396903
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
т.е. вот так

Код: plaintext
1.
 std::vector<cItem*> cv;
 cv.insert( new cItem, std::vector::end() );
...
Рейтинг: 0 / 0
03.02.2004, 16:10
    #32396910
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
Ладно сейчас попробую ... :)
____
...
Рейтинг: 0 / 0
03.02.2004, 16:12
    #32396913
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
блин, вторник тоже тяжелый день

надо вот так

Код: plaintext
1.
2.
3.
 cv.insert (cv.end(), new cItem );
или
 cv.push_back (new cItem);
...
Рейтинг: 0 / 0
03.02.2004, 16:13
    #32396918
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
std::vector::end()

а что то он у меня на это ругается ...

я юзаю Builder C++
____
...
Рейтинг: 0 / 0
03.02.2004, 16:19
    #32396928
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
ну теперь ужо проесняется
а если я запихал туды 5 элементов как
мне к 3-му допустим достучатся ?
____
...
Рейтинг: 0 / 0
03.02.2004, 16:19
    #32396929
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
хотя шас сам посмотрю как с этим работать дальше :)
____
...
Рейтинг: 0 / 0
03.02.2004, 16:22
    #32396931
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
мне к 3-му допустим достучатся ?

Код: plaintext
cv[ 3 ]
...
Рейтинг: 0 / 0
03.02.2004, 16:34
    #32396945
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
funikovyuri
наследовать от vector ничего не надо - это вообще бессмыслено так как там нету ни одной virtual функции :)

очень даже осмысленно :)

можно наследоваться, так :

class Items: protected vector<Item*> { ... }

т.е. например для переопрееления конструкторов, для замены/дополнения внешнего интерфейса и т.д.

более того, такие замены делают код более управляемым, внешний интерфейс Items можно оставить, а вот реализацию менять, как будет угодно...

напр. распространенный случай - последовательная коллекция, имеющая ф-ии быстрого поиска по ключам. Тут в классе-коллекции комбинируют и вектора и хеш-таблицы на все интересующие ключи.
...
Рейтинг: 0 / 0
03.02.2004, 16:53
    #32396973
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
2funikovyuri
я ужо сам догодался :))
но все равно зенькс ...

____
...
Рейтинг: 0 / 0
03.02.2004, 17:20
    #32397017
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
т.е. например для переопрееления конструкторов, для замены/дополнения внешнего интерфейса и т.д.

Да нет - можно конечно только во-первых , плохо это или хорошо, - но STL была спроектирована так что наследованию там места не нашлось (об этом говорил сам Степанов).

во-вторых
Сам же отлично знаешь что protected наследование - это кандидат для агрегации (очень редки случаи его реального применения). А public реализовать мез virtual не удастся - точнее - создатели STL не хотели чтоб удалось...
...
Рейтинг: 0 / 0
04.02.2004, 11:35
    #32397672
JibSkeart
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
2funikovyuri
самое интерестное что когда я ковырял исходник
какойто проги на VC
то там было иммено так

Код: plaintext
1.
2.
3.
4.
class Pitems :public vector<pItem*>
{
  ...
}


вот по этому я и спросил так лутьше или так ... :)
____
...
Рейтинг: 0 / 0
04.02.2004, 12:36
    #32397803
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
2 funikovyuri

Отсутствие виртуальных функций класса еще ничего не говорит о том, что наследоваться от данного класса нельзя.

Главное, чтобы в коде не было удаления через указатель на предка:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
// конкретный класс
class concrete_class
{
public:
    void foo() {}
};

// улучшаем конкретный класс
class derived_from_concrete_class : public concrete_class
{
   int some_var;
public:
   
    void foo() 
    {
         concrete_class::foo();
         // улучшения
    }
};


...
concrete_class* base = new derived_from_concrete_class;
delete base; // вот здесь скажется отсутствие виртуального деструктора


Так что, наследуйтесь от чего угодно и улучшайте существующие реализации с одной лишь оговоркой - где не требуется полиморфное поведение от объекта.

Удачи.
...
Рейтинг: 0 / 0
04.02.2004, 12:50
    #32397831
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
2 funikovyuri

И еще:) Чтобы достучаться к третьему элементу надо писать v[2], а не v[3].

Удачи.
...
Рейтинг: 0 / 0
04.02.2004, 13:53
    #32397961
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
Анатолий Широков

Отсутствие виртуальных функций класса еще ничего не говорит о том, что наследоваться от данного класса нельзя.

А я разве говорил что нельзя? Вы невнимательно читали мои сообщения - пожалуйста наследуйте (через public) а потом требуйте от клиентов не использовать полиморфизм - я как раз и говорил о том что умный такого делать не станет...

Чтобы достучаться к третьему элементу надо писать v[2], а не v[3].

Да, сыр, подъеб..ли вы меня что уж тут скажешь...
...
Рейтинг: 0 / 0
04.02.2004, 14:45
    #32398084
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
2 funikovyuri

дарю

рекомендую к использованию там, где постоянно создаются и удаляются вектора, особенно если их размер примерно одного порядка.

прибавка к быстродействию порой раз в 10 на этих специфичных местах.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
//////////////////////////////////////////////////////////////////////////
// fast-allocating array
// uses chunk pool
template<typename _Ty>
class fast_array : public std::vector<_Ty> {
	typedef std::vector<_Ty> super;
	typedef fast_array<_Ty> my_type;

	static bool destroyed;

	static struct pool_t: public std::vector<super*> {
		~pool_t() {
			for(pool_t::iterator i=this->begin(), e=this->end(); i!=e; ++i)
				delete *i;
			destroyed=true;
		}

	} pool; 

	static size_t top;

	static void get_chunk(my_type* instance) {
		size_t sz=pool.size();
		if (top>=sz)
			pool.resize(top* 2 + 50 );

		super* chunk=pool[top];
		if (chunk==NULL) 
			chunk=pool[top]=new super();	// we don't need to deallocate chunks :)

		++top;
		instance->swap(*chunk);
	}

	static void put_chunk(my_type* instance) {
		 --top;
 
		pool[top]->swap(*instance);
	}

public:
	fast_array() { get_chunk(this); resize( 0 ); }
	~fast_array() { if(!destroyed) put_chunk(this); }
};

template<class _Ty> bool fast_array<_Ty>::destroyed= 0 ;
template<class _Ty> size_t fast_array<_Ty>::top= 0 ;
template<class _Ty> typename fast_array<_Ty>::pool_t fast_array<_Ty>::pool;

//////////////////////////////////////////////////////////////////////////
typedef fast_array<char>	char_array;
typedef fast_array<int>	int_array;
typedef fast_array<size_t>	uint_array;
typedef fast_array<real>	real_array;


для типов - элементов вектора, требующих немедленного деструктора (скажем, для смарт-поинтеров объектов, владеющих "большими" ресурсами) можно добавить resize(0) при возврате в пул и убрать его из конструктора.

тут как раз примеры наследования чисто ради переопределения конструкторов и деструкторов.

есть еще причины, по которым можно отнаследоваться по public - скажем, неохота использовать смарт-поинтеры в контейнере (много причин), но AddRef() и Release() у объектов, хранящихся по указателю, делать надо... Вот и наследуемся и переопределяем деструкторы и операции добавления, ресайза и пр.
...
Рейтинг: 0 / 0
04.02.2004, 15:20
    #32398159
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
Лови, Дим, обратно

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
//////////////////////////////////////////////////////////////////////////
// fast-allocating array
// uses chunk pool
template<typename _Ty>
class fast_array
{
	typedef std::vector<_Ty> super;
	typedef fast_array<_Ty> my_type;

	super stl_vector;

	static bool destroyed;

	static struct pool_t: public std::vector<super*> {
		~pool_t() {
			for(pool_t::iterator i=this->begin(), e=this->end(); i!=e; ++i)
				delete *i;
			destroyed=true;
		}

	} pool; 

	static size_t top;

	static void get_chunk(my_type* instance) {
		size_t sz=pool.size();
		if (top>=sz)
			pool.resize(top* 2 + 50 );

		super* chunk=pool[top];
		if (chunk==NULL) 
			chunk=pool[top]=new super();	// we don't need to deallocate chunks :)

		++top;
		instance->stl_vector.swap(*chunk);
	}

	static void put_chunk(my_type* instance) {
		 --top;
 
		pool[top]->swap(instance->stl_vector);
	}

public:
	fast_array() { get_chunk(this); stl_vector.resize( 0 ); }
	~fast_array() { if(!destroyed) put_chunk(this); }
};

template<class _Ty> bool fast_array<_Ty>::destroyed= 0 ;
template<class _Ty> size_t fast_array<_Ty>::top= 0 ;
template<class _Ty> typename fast_array<_Ty>::pool_t fast_array<_Ty>::pool;

//////////////////////////////////////////////////////////////////////////

typedef fast_array<char>	char_array;
typedef fast_array<int>	int_array;
typedef fast_array<size_t>	uint_array;
typedef fast_array<real>	real_array;


Я заменил protected наследование агрегацией
А public наследование внутри класса менять не стал по 2м причинам
- лень
- это локальный класс и область его применения очень узка - так что можно гарантировать его правильное применение самостоятельно - но опять же ничего хорошего в этом нет
...
Рейтинг: 0 / 0
04.02.2004, 17:38
    #32398431
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
Вообщето-то там было именно public наследование, т.е. инстанс класса ведет себя именно как обычный STL-вектор, а то, что ты прислал - класс без единого полезного метода. (при желании можно переопределить все сигнатуры конструкторов вектора)

Внутренний класс тоже именно STL вектор, и именно в этом качестве он и используется. Зачем наследование? да ради только деструктора .

И такие вещи я делаю сплошь и рядом - экономлю время, вовсю пользуя STL.

Наследование еще никто не отменял, даже если в цепочке наследования нет фиртуальных ф-ий. Согласно правилам гомоморфных иерархий, с наследованием при наличии виртуальных ф-ий надо быть осторожнее, ибо чистая гомоморфная иерархия предполагает, что к базовому набору виртуальных ф-ий не добавляются никакие другие виртуальные ф-ии в процессе наследования. Однако наследование зачастую используется не только с целью использовать полиморфизм и строить эти чистые гомоморфные иерархии, зачастую мы используем наследование для тривиальной декомпозиции (с целью повторного использования кода).
...
Рейтинг: 0 / 0
04.02.2004, 18:20
    #32398500
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
Дмитрий
Вообщето-то там было именно public наследование,
Ты вообще мои сообщения читаешь? Там public наследование как раз осталось - я избавился только от protected

а то, что ты прислал - класс без единого полезного метода.

То что я прислал - это 100% рабочий эквивалент того что прислал ты - но без protected-наследования... Я опять же сомневаюсь что ты внимательно прочитал мой ответ

Наследование еще никто не отменял, даже если в цепочке наследования нет фиртуальных ф-ий. Согласно правилам гомоморфных иерархий, с наследованием при наличии виртуальных ф-ий надо быть осторожнее, ибо чистая гомоморфная иерархия предполагает, что к базовому набору виртуальных ф-ий не добавляются никакие другие виртуальные ф-ии в процессе наследования. Однако наследование зачастую используется не только с целью использовать полиморфизм и строить эти чистые гомоморфные иерархии, зачастую мы используем наследование для тривиальной декомпозиции (с целью повторного использования кода).

Ты хоть сам-то пытался понять что написал? Полная каша из терминов с выходной полезной составляюще стремящейся к 0 - такой фигней пугать можно разве что ежиков в лесу :)
...
Рейтинг: 0 / 0
04.02.2004, 18:25
    #32398506
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
так - я все перепутал - у тебя в обоих случаях public-наследование...

Только вот теперь мне вообще не ясно - что ты своим кодом пытался показать (я думал ты демонстрируешь применение protected-inheritance) - да можно наследовать для того чтобы добавлять - но не изменять - так как иначе нарушится полиморфизм...
...
Рейтинг: 0 / 0
04.02.2004, 19:56
    #32398591
Доброжелатель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
Ух, понаписли-то сколько :)

2 vdimas
Наследование еще никто не отменял, даже если в цепочке наследования нет фиртуальных ф-ий. Согласно правилам гомоморфных иерархий, с наследованием при наличии виртуальных ф-ий надо быть осторожнее, ибо чистая гомоморфная иерархия предполагает, что к базовому набору виртуальных ф-ий не добавляются никакие другие виртуальные ф-ии в процессе наследования. Однако наследование зачастую используется не только с целью использовать полиморфизм и строить эти чистые гомоморфные иерархии, зачастую мы используем наследование для тривиальной декомпозиции (с целью повторного использования кода).

А с "нечистой" гомоморфной иерархией какие проблемы могут возникнуть?
Если ты про "бриллиантовое" наследование, то в этом случае стандартом оговорены правила доминирования.

2 funikovyuri
ндя, видно у тебя день не задался ;)
Дался тебе этот полиморфизм.

PS Кстати, сейчас рулит статический полиморфизм.
...
Рейтинг: 0 / 0
04.02.2004, 20:02
    #32398594
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
Доброжелатель

Дался тебе этот полиморфизм.

Это не я - это они первые начали...

PS Кстати, сейчас рулит статический полиморфизм.

В смысле overloading - так он та тут при чем?
...
Рейтинг: 0 / 0
05.02.2004, 03:38
    #32398714
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
2 funikovyuri
Вообще-то я дал пример полезного класса - наследника вектора. Этот класс весьма применим в случаях частого создания и удаления векторов. Используй и наслаждайся.

Как видишь, он образован путем public-наследования, и переопределяет только конструктор и деструктор с целью использования пула векторов (вернее - пула "тел" векторов, используя замечательную STL парадигму - swap).

Насчет терминов и пр. - это ты зря, я просто попытался возразить насчет твоего утверждения об необходимости наследования только в случае виртуальных методов, и попытался напомнить, что это просто еще один тип наследования для образования определенного рода иерархий, и путать или "разбавлять" типы иерархий и целей наследования не следует. (видишь, стараюсь без терминологии)

2 Доброжелатель
А с "нечистой" гомоморфной иерархией какие проблемы могут возникнуть?
Проблема "каши". Проблема попыток узнать в методах базового класса тип актуального наследника и пр. прелести.
...
Рейтинг: 0 / 0
05.02.2004, 22:22
    #32400091
vdimas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кллекция кнопочек :)) вообщем как это реализавать чере STL ?
2 Доброжелатель

PS Кстати, сейчас рулит статический полиморфизм

Да не рулит он, просто сейчас многие компиляторы наконецто начали более или менее поддерживать стандарт оговоренный еще бог его знает когда и упомянутая парадигма просто заняла свое место.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Кллекция кнопочек :)) вообщем как это реализавать чере STL ? / 25 сообщений из 29, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]