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
Implementacion
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.
Cualquier duda en la caja de comentarios, Saludos.
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.