#include <iostream>
#include <utility>
#include <stdexcept>
class String{
char *niz;
int duzina;
public:
String() : niz(new char[1]), duzina(0){
niz[0] = '\0';
}
String(const char *s){
auto s1 = s;
int brojac = 0;
while(*s1!='\0') {brojac++; s1++;}
niz = new char[brojac + 1];
for(int i = 0; i < brojac; i++){
niz[i] = s[i];
}
niz[brojac] = '\0';
duzina = brojac;
}
String(const std::string &s){
duzina = s.size();
niz = new char [duzina + 1];
for(int i = 0; i < duzina; i++){
niz[i] = s[i];
}
niz[duzina] = '\0';
}
~String() { delete [] niz;}
String (const String &s): niz(new char[s.duzina + 1]), duzina(s.duzina){
for(int i = 0; i <= duzina; i++){
niz[i] = s.niz[i];
}
}
String ( String &&s) :niz(s.niz), duzina(s.duzina) {
s.niz = nullptr;
s.duzina = 0;
}
String &operator=(String s){
std::swap(niz, s.niz);
std::swap(duzina, s.duzina);
return *this;
}
int DajDuzinu() const { return duzina;}
char &operator[](int i){
if(i < 0 || i >= duzina) throw std::logic_error("Nedozvoljena duzina");
return niz[i];
}
const char &operator[](int i) const{
if(i < 0 || i >= duzina) throw std::logic_error("Nedozvoljena duzina");
return niz[i];
}
friend String operator+ (const String &s1, const String &s2){
String r;
delete [] r.niz;
r.duzina = s1.duzina + s2.duzina;
r.niz = new char [r.duzina + 1];
for(int i = 0; i < r.duzina; i++){
if(i >= s1.duzina) {
r.niz[i] = s2.niz[i - s1.duzina]; continue;
}
r.niz[i] = s1.niz[i];
}
r.niz[r.duzina] = '\0';
return r;
}
String &operator +=(const String &s){
int novad = duzina + s.duzina;
char *novi = new char[novad + 1];
auto pomocni = niz;
for(int i = 0; i < novad; i++){
if(i >= duzina){
novi[i] = s.niz[i - duzina];
continue;
}
novi[i] = niz[i];
}
novi[novad] = '\0';
niz = novi;
duzina = novad;
delete [] pomocni;
return *this;
}
friend std::ostream &operator <<(std::ostream &tok, const String &s){
tok << s.niz;
return tok;
}
};
int main() {
String s1("Dobar ");
String s2("dan");
std::cout << "s1: " << s1 << std::endl;
std::cout << "s2: " << s2 << std::endl;
String s3 = s1 + s2;
std::cout << "s1 + s2: " << s3 << std::endl;
String s4 = s3 + " svima";
std::cout << "s3 + \" svima\": " << s4 << std::endl;
String s5 = "Pozdrav, " + s2;
std::cout << "\"Pozdrav, \" + s2: " << s5 << std::endl;
s1 += s2;
std::cout << "s1 nakon += s2: " << s1 << std::endl;
std::cout << "Duzina s1: " << s1.DajDuzinu() << std::endl;
s1[0] = 'M';
std::cout << "s1 nakon izmjene prvog znaka: " << s1 << std::endl;
String kopija(s1);
std::cout << "Kopija s1: " << kopija << std::endl;
String pomjereni(std::move(kopija));
std::cout << "Pomjereni string: " << pomjereni << std::endl;
std::cout << "Duzina kopije nakon move: " << kopija.DajDuzinu() << std::endl;
String dodjela;
dodjela = pomjereni;
std::cout << "Dodjela: " << dodjela << std::endl;
try {
std::cout << s1[s1.DajDuzinu()] << std::endl;
} catch(std::logic_error &e) {
std::cout << "Uhvatili smo izuzetak: " << e.what() << std::endl;
}
return 0;
}
To embed this project on your website, copy the following code and paste it into your website's HTML: