[CODIGO FUENTE] Implementar String class en C++

  • Hola Invitado, si deseas saber que es lo que paso con nuestro servidor de discord, puedes ingresar al siguiente enlace Discord


1
Me Gusta
3
Temas

crack81

Curioso
Registrado
17 Jul 2020
Mensajes
4
Mejores respuestas
0
LV
0
 
Hace tiempo escribe una clase en C++ donde implement mi propia verion de la clase String de C++ pero sin niguna dependencia y usando C++ 11, el snippet es util en temas de malware donde no se quiere importar <iostream> o <string> directamente en tu proyecto para ahorrar unos bytes en memoria ademas.

Header

Código:
#ifndef ZSTRING_H
#define ZSTRING_H

typedef unsigned long zUlong;

class ZString
{
private:
    char* zPtrString;
    zUlong zLength;


    void zCopy(const char* source,char* destination);
    void zCopyAlloc(const char* source);
    zUlong zStrLen(const char* source) const;
public:

    ZString();
    ZString(const char* source);
    ZString(const ZString& source);


    ZString& operator=(const ZString& source)
    {
        if(this!=&source)
        {
            zCopyAlloc(source.to_Cstr());
        }
        return *this;
    }

    ZString& operator=(const char* source)
    {
        if(source!=nullptr)
        {
            zCopyAlloc(source);
        }
        return *this;
    }

    char& operator[] (zUlong pos)
    {
        return zPtrString[pos];
    }

    const char& operator[] (zUlong pos) const
    {
        return zPtrString[pos];
    }

    bool operator==(const ZString& str)const
    {
        return this->zCompare(str);
    }


    const char* to_Cstr() const;
    zUlong zSize() const;
    bool zIsEmpty() const;
    void zClear();
    bool zCompare(const char *str) const;
    bool zCompare(const ZString& str) const;

 
    ~ZString();
};
#endif // ZSTRING_H

Implementacion

Código:
#include "zstring.h"

ZString::ZString()
{
    zPtrString=nullptr;
    zLength=0;
}

ZString::ZString(const char* source)
{
    zPtrString=nullptr;
    if(source!=nullptr)
    {
        zCopyAlloc(source);
    }
}

ZString::ZString(const ZString& source)
{
    zPtrString=nullptr;
    zCopyAlloc(source.to_Cstr());
}

void ZString::zCopy(const char* source,char* destination)
{
    int i=0;
    for(i=0;source[i];i++)
    {
        destination[i]=source[i];
    }
    destination[i]='\0';
}

void ZString::zCopyAlloc(const char* source)
{
    if(zPtrString!=nullptr)
        delete[] zPtrString;

    zUlong len=zStrLen(source);
    zPtrString=new char[len+1];
    zCopy(source,zPtrString);
    zLength=len;
}

zUlong ZString::zStrLen(const char* source) const
{
    zUlong counter=0;
    char* stemp=(char*)source;

    while(*stemp++)counter++;
    return counter;
}

const char* ZString::to_Cstr() const
{
    return zPtrString;
}

zUlong ZString::zSize() const
{
    return zLength;
}


bool ZString::zIsEmpty() const
{
    return zPtrString==nullptr || zLength==0;
}

void ZString::zClear()
{
    zCopyAlloc("");
}

bool ZString::zCompare(const char* str) const
{
    if(zSize() != zStrLen(str)) return false;

    char* stemp1=(char*)str;
    char* stemp2=(char*)zPtrString;

    while(*stemp1 && *stemp2)
    {
        if(*stemp1!=*stemp2) return false;
        stemp1++;
        stemp2++;
    }
    return true;
}


bool ZString::zCompare(const ZString& str) const
{
    if(zSize() != str.zSize()) return false;

    char* stemp1=(char*)str.to_Cstr();
    char* stemp2=(char*)zPtrString;

    while(*stemp1 && *stemp2)
    {
        if(*stemp1!=*stemp2) return false;
        stemp1++;
        stemp2++;
    }
    return true;
}



 ZString::~ZString()
 {
     if(zPtrString!=nullptr)
     {
         delete[] zPtrString;
     }
 }


Uso de la clase, en este caso estoy importando iostream solo para imprimir el texto por consola pero cuando esten haciendo sus malware o la cosa que esten programando lo mas seguro es que no necesiten importar el iostream y ahi es donde se ahorren algo en memoria ademas que ustedes implemetnar mas funciones dependiendo sus necesidades.

Código:
#include <iostream>
#include "zstring.h"
using namespace std;

int main()
{
    ZString msg="hello world";
    cout<<msg.to_Cstr()<<endl;

    
    for(unsigned int i=0;i<msg.zSize();i++)
    {
        cout<<"letter: "<<msg[i]<<endl;
    }


    ZString other;
    other="other string";

    if(msg==other)cout<<"it's equal"<<endl;
    else cout<<"it's different"<<endl;

    return 0;
}

Cualquier duda en la caja de comentarios, Saludos.