C++, retezec
Dobrý den, mám problém, podle knížky Naučte se programovat za 21 dní jsem sestavil tento kód, ale když ho chci zkompilovat vyhodí to chybu: Linker error, kdyby byl někdo tak hodnný a řekl mi v čem mám chybu a jak jí odstranit, byl bych rád, Děkuji.
Kód zde:
#include <iostream>
#include <string>
using namespace std;
class Retezec
{
public:
Retezec(); //Konstruktory
Retezec(const char* const);
Retezec(const Retezec&);
~Retezec();
char & operator[] (unsigned short Odsazeni); //Pretizene operatory
char operator[] (unsigned short Odsazeni) const;
Retezec & operator= (const Retezec&);
Retezec operator+ (const Retezec&);
void operator+= (const Retezec&);
unsigned short PrevzitDelku() const {return DelkaRetezce;} //Pristupove metody
const char* PrevzitRetezec() const {return TenRetezec;}
private:
Retezec (unsigned short); //Soukromy konstruktor
char* TenRetezec;
unsigned short DelkaRetezce;
};
Retezec::Retezec() //Vychozi konstruktor vytvori retezec o delce 0 bajtu
{
TenRetezec = new char[1];
TenRetezec[0] = '\0'; //Hodnota NULL
DelkaRetezce = 0;
}
Retezec::Retezec(unsigned short Pocet) //Soukromy konstruktor pro metody tridy, vytvori novy retezec
{ //o zadane delce, je naplneny NULLami
TenRetezec = new char[Pocet+1];
for(unsigned short i=0; i<=Pocet; i++)
{
TenRetezec[i] = '\0';
}
DelkaRetezce = Pocet;
}
Retezec::Retezec(const char* const cRetezec) //Prevede znakove pole na retezec
{
DelkaRetezce = strlen(cRetezec);
TenRetezec = new char[DelkaRetezce+1];
for(unsigned short i=0; i<=DelkaRetezce; i++)
{
TenRetezec[i] = cRetezec[i];
}
TenRetezec[DelkaRetezce] = '\0';
}
Retezec::Retezec(const Retezec & copy) //Konstruktor pro kopirovani
{
DelkaRetezce = copy.PrevzitDelku();
TenRetezec = new char [DelkaRetezce+1];
for(unsigned short i=0; i<=DelkaRetezce; i++)
{
TenRetezec[i] = copy[i];
}
TenRetezec[DelkaRetezce] = '\0';
}
Retezec::~Retezec() //Destruktor, uvolni zabranou pamet
{
delete[] TenRetezec;
DelkaRetezce = 0;
}
Retezec& Retezec::operator=(const Retezec ©) //Operator prirazeni priradi potrebnou pamet a
{ //a zkopiruje delku retezce a retezec
if(this == ©)
{
return *this;
}
delete[] TenRetezec;
DelkaRetezce = copy.PrevzitDelku();
TenRetezec = new char[DelkaRetezce+1];
for(unsigned short i=0; i<DelkaRetezce; i++)
{
TenRetezec[i] = copy[i];
}
TenRetezec[DelkaRetezce] = '\0';
return *this;
}
char& Retezec::operator[] (unsigned short Odsazeni) //Nekonstatni operator odsazeni vraci odkaz na znak,
{ //aby jej bylo mozno zmenit
if(Odsazeni > DelkaRetezce)
return TenRetezec[DelkaRetezce-1];
else
return TenRetezec[Odsazeni];
}
Retezec Retezec::operator+ (const Retezec& copy) //Vytvari novy retezec pridanim aktualniho k copy
{
unsigned short CelkovaDelka = DelkaRetezce + copy.PrevzitDelku();
Retezec Docasny(CelkovaDelka);
unsigned short i;
for(i=0; i<DelkaRetezce; i++)
{
Docasny[i] = TenRetezec[i];
}
for(unsigned short j=0; i<CelkovaDelka; i++, j++)
{
Docasny[i] = copy[j];
}
Docasny[CelkovaDelka] = '\0';
return Docasny;
}
void Retezec::operator+= (const Retezec& copy)
{
unsigned short copyDelka = copy.PrevzitDelku();
unsigned short CelkovaDelka = DelkaRetezce + copyDelka;
Retezec Docasny(CelkovaDelka);
unsigned short i;
for(i=0; i<DelkaRetezce; i++)
{
Docasny[i] = TenRetezec[i];
}
for(unsigned short j=0; i<copy.PrevzitDelku(); i++, j++)
{
Docasny[i] = copy[j-DelkaRetezce];
}
Docasny[CelkovaDelka] = '\0';
*this = Docasny;
}
int main()
{
Retezec Prvni("Prvni test");
cout << "Prvni retezec:\t" << Prvni.PrevzitRetezec() << endl;
char *Docasny = "Ahoj Svete";
Prvni = Docasny;
cout << "Prvni retezec:\t" << Prvni.PrevzitRetezec() << endl;
char DocasnyDve[20];
strcpy(DocasnyDve, ";Programovani");
Prvni += DocasnyDve;
cout << "DocasnyDve:\t" << DocasnyDve << endl;
cout << "Prvni:\t" << Prvni.PrevzitRetezec() << endl;
cout << "Prvni[4]:\t" << Prvni[4] << endl;
Prvni[4] = 'x';
cout << "Prvni:\t" << Prvni.PrevzitRetezec() << endl;
cout << "Prvni[999]:\t" << Prvni[999] << endl;
Retezec Druhy("Druhy retezec");
Retezec Treti;
Treti = Prvni + Druhy;
cout << "Treti:\t" << Treti.PrevzitRetezec() << endl;
Retezec Ctvrty;
Ctvrty = "Funguje to?";
cout << "Ctvrty:\t" << Ctvrty.PrevzitRetezec() << endl;
cin.get();
return 0;
}
Chýba ti tam implementácia metódy:
char Retezec::operator[] (unsigned short Odsazeni) const
Ten linker error ti to asi aj píše úplne presne.