Witam,
W ramach nauki programowania obiektowego postanowiłem napisać własną listę. Udało mi się tego dokonać, ale na razie tylko dla konkretnego typu danych (int). Chciałbym umieć wykonać taką listę również dla niesprecyzowanego z góry typu ( czyli krótko mówiąc zrobić jej szablon).
Kod działającej listy dla int:
#include <iostream>
using namespace std;
class cPart;
class cList;
class cList
{
private:
int m_size;
cPart* m_first;
cPart* m_last;
cPart* m_nothing;
public:
cList();
~cList();
int size(){ return m_size; }
void size_up(){ m_size++; }
void size_down(){ m_size--; }
cPart* nothing(){ return m_nothing; }
cPart* first(){ return m_first; }
cPart* last(){ return m_last; }
void set_first(cPart* pointer) { m_first = pointer; }
void set_last(cPart* pointer) { m_last = pointer; }
inline cPart* set_pointers(cPart*);
//--- metody właściwe
void push_f(int);
//void push_b(int);
//void insert(int);
};
class cPart
{
private:
cPart* m_next;
cPart* m_previous;
int m_value;
public:
cPart(int value);
//~cPart();
cPart* next(){ return m_next; }
cPart* previous(){ return m_previous; }
int value(){ return m_value; }
void set_next(cPart* pointer){ m_next = pointer; }
void set_previous(cPart* pointer){ m_previous = pointer; }
void set_value(int value){ m_value = value; }
cPart* pointer(){ return this; }
};
//------------ metody cList
cList::cList()
{
m_nothing = new cPart(0);
m_first = m_last = m_nothing;
}
cList::~cList()
{
;//clear();
delete m_nothing;
}
inline cPart* cList::set_pointers(cPart* pointer)
{
pointer->set_next( nothing() );
pointer->set_previous( nothing() );
return pointer;
}
void cList::push_f(int value)
{
cPart* pointer = set_pointers( new cPart(value) );
if(size() == 0) set_last(pointer);
if(m_first != m_nothing )
{
pointer->set_previous(m_first);
m_first->set_next(pointer);
}
m_first = pointer;
size_up();
}
//------------- metody cPart
cPart::cPart(int value)
{
m_value = value;
//m_next = m_previous = this;
}
A to jest to co próbowałem zamienić na szablon ( klasa cPart nie posiada wszystkich metod - bo na razie chodzi mi o to, żeby się to skompilowało):
#include <iostream>
using namespace std;
template<typename TYPE>class cPart;
template<typename TYPE>class cList;
template<typename TYPE>class cList
{
private:
int m_size;
cPart<TYPE>* m_first;
cPart<TYPE>* m_last;
cPart<TYPE>* m_nothing;
public:
cList();
~cList();
int size(){ return m_size; }
void size_up(){ m_size++; }
void size_down(){ m_size--; }
cPart<TYPE>* nothing(){ return m_nothing; }
cPart<TYPE>* first(){ return m_first; }
cPart<TYPE>* last(){ return m_last; }
void set_first(cPart<TYPE>* pointer) { m_first = pointer; }
void set_last(cPart<TYPE>* pointer) { m_last = pointer; }
inline cPart<TYPE>* set_pointers(cPart<TYPE>*);
//--- metody właściwe
// void push_f(int);
};
template<typename TYPE>class cPart
{
private:
TYPE m_value;
public:
TYPE value() { return m_value; }
};
//------------ metody cList
cList::cList()
{
m_nothing = new cPart(0);
m_first = m_last = m_nothing;
}
cList::~cList()
{
//clear();
delete m_nothing;
}
inline cPart* cList::set_pointers(cPart<TYPE>* pointer)
{
pointer->set_next( nothing() );
pointer->set_previous( nothing() );
return pointer;
}
Konkretnie ( jak widać przy kompilacji) chodzi mi o te 3 ostatnie metody. Długo się męczyłem, żeby to działało i niestety nic z tego... :P
Czy ktoś mógłby mi pomóc?
Pozdrawiam
PS.
Poniżej jeszcze kod pliku do "obsługi" listy (int'owej)
#include "list.h"
int main()
{
cList lista;
for(int i = 0; i < 10; i++)
{
lista.push_f(i);
}
for(cPart* iterator = lista.first(); iterator != list.nothing(); iterator = iterator->next() )
{
cout << iterator->value() << endl;
}
}