Witam, mam problem.
Przepisalem sobie z ksiazki Jerzego Grebosza jeden przyklad, zeby sprawdzic, czy lista jest rzeczywiscie tworzona "na koncu", mniejsza o przyczyny... problem jest taki, ze w borland C++ builderze 6.0 jak chce zbudowac projekt, to wywala mi takie bledy:
[C++ Warning] osoba.h(20): W8058 Cannot create pre-compiled header: code in header
[Linker Error] Unresolved external 'operator <<(_STL::basic_ostream<char, _STL::char_traits<char> >&, Dlista<osoba>&)' referenced from C:\FAVORITY\GREBOSZ001\GLOWNY.OBJ
a oto jak wygladaja pliki:
glowny.cpp
#include <iostream.h>
#include <string.h>
#include "osoba.h"
#include "Dlista.h"
#include <iomanip.h>
int main(void)
{
osoba
skarbD("stary Dab"),
skarbG("Glaz nad strumieniem"),
skarbA("Ambona mysliwska"),
skarbW("Wyspa"),
skarbKP("Kurchan"),
skarbKA("kamieniolom");
Dlista<osoba> trasa;
iteratorL<osoba> druzynowy(trasa);
trasa.wstaw(skarbD, druzynowy);
trasa.wstaw(skarbG, druzynowy);
trasa.wstaw(skarbA, druzynowy);
trasa.wstaw(skarbW, 1);
trasa.wstaw(skarbKP, druzynowy);
cout<<trasa;
cout<<"Zmieniamy wyspe..."<<endl;
trasa.usun(1);
druzynowy.na_wezel(3);
trasa.wstaw(skarbW,druzynowy);
cout<<trasa;
cout<<"iteratory...."<<endl;
iteratorL<osoba> druh(trasa), harcerka(trasa);
druh.na_koniec();
cout<<"Harcerka: Druh:"<<endl;
for(int i =0; i < trasa.rozmiar(); i++, harcerka++)
{
cout<<setw(20)<<*harcerka<<" "<<setw(20)<<*(druh--)<<endl;
}
return 0;
}
osoba.h:
#include <string.h>
class osoba
{
char nazwisko[30];
public:
osoba(char *n=NULL)
{
strcpy(nazwisko, n);
}
friend ostream & operator<<(ostream &s, const osoba &o);
friend ostream & operator<<(ostream &s, const osoba *wsk);
};
ostream &operator<<(ostream &s, const osoba &o)
{
s<< o.nazwisko ;
return s;
}
ostream &operator<<(ostream &s, const osoba *wsk)
{
s<< wsk->nazwisko ;
return s;
}
Dlista.h:
template <class typOBJ>
class iteratorL;
template <class typOBJ>
class Dlista
{
public:
struct wezel
{
typOBJ * wskobj;
wezel *nastepca;
wezel *poprzednik;
wezel():nastepca(NULL), wskobj(NULL), poprzednik(NULL)
{}
};
private:
wezel *pierwszyW;
wezel *ostatniW;
int dlugosc;
public:
typedef iteratorL<typOBJ> itLis;
Dlista()
{
pierwszyW = ostatniW = NULL;
dlugosc = 0;
}
~Dlista();
void wstaw(typOBJ &obj, itLis & iter);
void wstaw(typOBJ &obj, int nr)
{
itLis iter(*this);
iter.na_wezel(nr);
wstaw(obj, iter);
}
void wstaw(typOBJ &obj)
{
itLis iter(*this);
iter.zakoniec();
wstaw(obj, iter);
}
void usun(itLis &iter);
void usun(int nr)
{
itLis it(*this);
usun(it.na_wezel(nr));
}
int rozmiar() const
{
return dlugosc;
}
private:
void daje_na_poczatek(wezel *nowyW, itLis &iter);
void daje_w_srodku(wezel *nowyW, itLis &iter);
void daje_na_koniec(wezel *nowyW);
void usuwam_pierwszy(itLis &iter);
void usuwam_ostatni(itLis &iter);
void usuwam_ze_srodka(itLis &iter);
public:
friend ostream &operator<<(ostream &stru, Dlista<typOBJ> &x);
friend class iteratorL<typOBJ>;
};
template <class typOBJ>
void Dlista<typOBJ>::wstaw(typOBJ &obj, itLis &iter)
{
wezel *nowyW = new wezel;
nowyW->wskobj =&obj;
dlugosc++;
if(iter.wybranyW != NULL)
{
if(iter.wybranyW == pierwszyW)
{
daje_na_poczatek(nowyW,iter);
}
else
{
daje_w_srodku(nowyW, iter);
}
}
else daje_na_koniec(nowyW);
}
template<class typOBJ>
void Dlista<typOBJ>::daje_na_poczatek(wezel *nowyW, itLis &iter)
{
pierwszyW = nowyW;
nowyW->nastepca = iter.wybranyW;
iter.wybranyW->poprzednik = nowyW;
nowyW->poprzednik = NULL;
iter.wybranyW = nowyW;
}
template<class typOBJ>
void Dlista<typOBJ>::daje_w_srodku(wezel *nowyW, itLis &iter)
{
(iter.wybranyW->poprzednik)->nastepca = nowyW;
nowyW->nastepca = iter.wybranyW;
nowyW->poprzednik = iter.wybranyW->poprzednik;
iter.wybranyW->poprzednik = nowyW;
}
template<class typOBJ>
void Dlista<typOBJ>::daje_na_koniec(wezel *nowyW)
{
if(!pierwszyW)
{
pierwszyW = nowyW;
}
else
{
ostatniW->nastepca = nowyW;
nowyW->poprzednik = ostatniW;
}
ostatniW = nowyW;
}
template<class typOBJ>
void Dlista<typOBJ>::usun(itLis &iter)
{
if(iter.wybranyW == NULL)return;
dlugosc--;
if(iter.wybranyW == pierwszyW)
{
usuwam_pierwszy(iter);
}
else
{
if(iter.wybranyW == ostatniW)
usuwam_ostatni(iter);
else
usuwam_ze_srodka(iter);
}
}
template <class typOBJ>
void Dlista<typOBJ>::usuwam_pierwszy(itLis &iter)
{
pierwszyW = pierwszyW->nastepca;
delete iter.wybranyW;
iter.wybranyW = pierwszyW;
if(pierwszyW != NULL) pierwszyW->poprzednik = NULL;
else ostatniW = NULL;
}
template <class typOBJ>
void Dlista<typOBJ>::usuwam_ze_srodka(itLis &iter)
{
wezel *poprzW = iter.wybranyW->poprzednik;
poprzW->nastepca = iter.wybranyW->nastepca;
(iter.wybranyW->nastepca)->poprzednik = poprzW;
delete iter.wybranyW;
iter.wybranyW = poprzW;
}
template <class typOBJ>
void Dlista<typOBJ>::usuwam_ostatni(itLis &iter)
{
wezel *poprzW = iter.wybranyW->poprzednik;
poprzW->nastepca = NULL;
ostatniW = poprzW;
delete iter.wybranyW;
iter.wybranyW = NULL;
}
template <class typOBJ>
Dlista<typOBJ>::~Dlista()
{
itLis iter(*this);
for(int i =0; i < dlugosc; i++)
{
delete (iter++).wybranyW;
}
}
template <class typOBJ>
ostream &operator<<(ostream &stru, Dlista<typOBJ> &x)
{
iteratorL<typOBJ> skoczek(x);
for(int i =0; i < x.rozmiar(); i++)
{
stru<< i <<" "<<*(skoczek++)<<" ";
if(!( (i+1)%3 ))
{
stru<<endl;
}
}
stru<<endl;
return stru;
}
template <class typOBJ>
class iteratorL
{
friend class Dlista<typOBJ>;
Dlista<typOBJ>::wezel *wybranyW;
Dlista<typOBJ> & pojemnik;
public:
iteratorL(Dlista<typOBJ> &pojem) : pojemnik(pojem)
{
wybranyW = pojemnik.pierwszyW;
}
iteratorL &na_poczatek()
{
wybranyW=pojemnik.pierwszyW;
return *this;
}
iteratorL &na_koniec()
{
wybranyW=pojemnik.ostatniW;
return *this;
}
iteratorL &za_koniec()
{
wybranyW=NULL:
return *this;
}
iteratorL &operator++()
{
wybranyW=wybranyW->nastepca;
return *this;
}
iteratorL &operator--()
{
wybranyW = wybranyW->poprzednik;
return *this;
}
iteratorL operator++(int)
{
iteratorL stary = *this;
++*this;
return stary;
}
iteratorL operator--(int)
{
iteratorL stary = *this;
--*this;
return stary;
}
typOBJ &operator*()
{
return *(wybranyW->wskobj);
}
iteratorL &na_wezel(int n);
iteratorL &operator=(const iteratorL &prawy)
{
wybranyW = prawy.wybranyW;
return *this;
}
int operator==(const iteratorL &prawy)
{
if(wybranyW == prawy.wybranyW) return 1;
else return 0;
}
int operator!=(const iteratorL &prawy)
{
if(wybranyW != prawy.wybranyW) return 1;
return 0;
}
operator int()
{
if(wybranyW!= NULL) return 1;
else return 0;
}
};
template <class typOBJ>
iteratorL<typOBJ> & iteratorL<typOBJ>::na_wezel(int n)
{
wybranyW = pojemnik.pierwszyW;
for(int i = 0; i < n; i++, ++(*this));
return *this;
}
Prosze o pomoc, bo juz kombinuje z tym 3 dni i nic...
Pozdrawiam.