Вообщем, в плане построения своей игры возникла необходимость использовать list, вместо vector, для хранения указателей на все игровые объекты. Не хватало всего одной функции - push_front, для того что бы созданные игровые объекты не обрабатывались в текущем цикле(это не правильно логически, один кадр конечно не смертельно, но шедевры собираются из мелочей...), и успевали отрисоваться в своих начальных координатах.
Попробовал просто сменить vector на list и по вылазила куча ошибок) И тут я задумался, а почему бы не попробовать написать подобный контейнер самому, только уже без десятков не нужных мне функций. Для половины критиков скажу сразу, Я не собираюсь спорить с STL и изобретать велосипед. У меня есть время и я хочу разобраться, как этот велосипед работает))
Как говорил мой школьный учитель физики:"С готовой формулой любой дурак сможет, а без слабо?" Короче хватит лирики, а то еще книгу напишу, "Как я писал на С++" Как устроены STL контейнеры я не читал, но думаю как и все шаблоны, включил логику и начал писать свой, иногда правда гуглил по форумам на счет динамических списков... Вот, то что я накидал за сегодня:
Code
//------------------------------------------------------------------------------
// Класс элемента
//------------------------------------------------------------------------------
template<class T> struct Element
{
T data; // Хранимые данные элемента
Element* next, * prev; // Указатели на соседние элементы
Element<T>(T); // Конструктор элемента
};
//------------------------------------------------------------------------------
// Класс листа
//------------------------------------------------------------------------------
template<class Type> class CList
{
public:
int size; // Колличество элементов в листе
Element<Type>* first, * last; // Указатели на крайние элементы
void push_front(Type); // Добавление в начало
void push_back(Type); // Добавление в конец
void del_elem(int); // Удаление элемента по номеру
Type* get_data(int); // Получение данных
CList<Type>(); // Конструктор списка по умолчанию
};
// Конструктор элемента
template<class T> Element<T>::Element(T pdata) {data=pdata;}
// Конструктор листа по умолчанию
template<class Type> CList<Type>::CList()
{
size=0;
first=NULL;
last=NULL;
}
// Добавление элемента в начало списка
template<class Type> void CList<Type>::push_front(Type pdata)
{
if (size==0)
{
first=new Element<Type>(pdata);
first->next=NULL;
first->prev=NULL;
last=first;
size+=1;
}
else
{
Element<Type>* temp=new Element<Type>(pdata);
temp->next=first;
temp->prev=NULL;
first->prev=temp;
first=temp;
size+=1;
}
}
// Добавление элемента в конец списка
template<class Type> void CList<Type>::push_back(Type pdata)
{
if (size==0)
{
last=new Element<Type>(pdata);
last->next=NULL;
last->prev=NULL;
first=last;
size+=1;
}
else
{
Element<Type>* temp=new Element<Type>(pdata);
temp->prev=last;
temp->next=NULL;
last->next=temp;
last=temp;
size+=1;
}
}
// Удаление элемента из списка по номеру
template<class Type> void CList<Type>::del_elem(int num)
{
if (num==0)
{
Element<Type>* temp=first;
first->next->prev=NULL;
first=first->next;
delete temp;
size-=1;
}
if (num==size-1)
{
Element<Type>* temp=last;
last->prev->next=NULL;
last=last->prev;
delete temp;
size-=1;
}
if (num>0 && num<size-1)
{
Element<Type>* temp=first;
for (int i=0; i<num; i++)
{
temp=temp->next;
}
temp->prev->next=temp->next;
temp->next->prev=temp->prev;
delete temp;
size-=1;
}
}
// Получение данных из элемента
template<class Type> Type* CList<Type>::get_data(int num)
{
if (num==0) {return &first->data;}
if (num==size-1) {return &last->data;}
if (num>0 && num<size-1)
{
Element<Type>* temp=first->next;
for (int i=1; i<num; i++)
{
temp=temp->next;
}
return &temp->data;
}
else {return NULL;}
}
P.S. Поскольку пишу я быдлокодом, то попрошу вас товарищи, указывать на все мои ошибки, даже которые не касаются работоспособности кода.
Скажите что не правильно и что можно сделать лучше, пока я не начал писать дальше...
Всем заранее спасибо!
Добавлено (20.10.2010, 11:37)
---------------------------------------------
Хм... так отдельно в своем проекте работает, а как добавляю в игру и разбиваю на 2 файлы сср и h. При попытке создать экземпляр выдает такую гадость:
Code
1>lists.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall CList<class CObject *>::CList<class CObject *>(void)" (??0?$CList@PAVCObject@@@@QAE@XZ) в функции "void __cdecl `dynamic initializer for 'MyList''(void)" (??__EMyList@@YAXXZ)
Помогите разобраться...(((