#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;
}

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: