Sto provando a scrivere la mia classe di stringhe C++ per scopi didattici e di necessità.
La prima cosa è che non ne so molto degli operatori ed è per questo che voglio impararli. Ho iniziato a scrivere il mio corso, ma quando lo eseguo blocca il programma ma non fa alcun crash.
Date un'occhiata al seguente codice di favore, prima di leggere oltre:Classe stringa personalizzata (C++)
class CString
{
private:
char* cstr;
public:
CString();
CString(char* str);
CString(CString& str);
~CString();
operator char*();
operator const char*();
CString operator+(const CString& q)const;
CString operator=(const CString& q);
};
Prima di tutto io non sono così sicuro dichiarai tutto per bene. Ho provato googleing a riguardo ma tutti i tutorial sull'overloading spiegano l'ideea di base che è molto semplice ma non spiega come e quando ogni cosa viene chiamata. Ad esempio nel mio operatore = il programma chiama CString (CString & str); ma non ho ideea perché.
Ho anche allegato il file cpp di seguito:
CString::CString()
{
cstr=0;
}
CString::CString(char *str)
{
cstr=new char[strlen(str)];
strcpy(cstr,str);
}
CString::CString(CString& q)
{
if(this==&q)
return;
cstr = new char[strlen(q.cstr)+1];
strcpy(cstr,q.cstr);
}
CString::~CString()
{
if(cstr)
delete[] cstr;
}
CString::operator char*()
{
return cstr;
}
CString::operator const char*()
{
return cstr;
}
CString CString::operator +(const CString &q) const
{
CString s;
s.cstr = new char[strlen(cstr)+strlen(q.cstr)+1];
strcpy(s.cstr,cstr);
strcat(s.cstr,q.cstr);
return s;
}
CString CString::operator =(const CString &q)
{
if(this!=&q)
{
if(cstr)
delete[] cstr;
cstr = new char[strlen(q.cstr)+1];
strcpy(cstr,q.cstr);
}
return *this;
}
Per la prova ho usato un codice altrettanto semplice come questo
CString a = CString ("Ciao") + CString ("World");
printf (a);
Ho provato a debuggarlo ma a un certo punto mi sono perso. Prima chiama il costruttore 2 volte per "ciao" e per "mondo". Quindi entra nell'operatore + che sta bene. Quindi chiama il costruttore per la stringa vuota. Dopodiché entra in "CString (CString & str)" e ora sono perso. Perché sta succedendo? Dopo ciò ho notato che la mia stringa contenente "Hello World" si trova nel distruttore (alcune volte di seguito). Di nuovo sono molto confuso. Dopo la conversione di nuovo da char * a Cstring e avanti e indietro si ferma. Non entra mai nell'operatore =, ma non va oltre. printf (a) non viene mai raggiunto.
Io uso VisualStudio 2010 per questo, ma è fondamentalmente codice appena standard di C++ e quindi non credo che si dovrebbe fare che molta differenza
Capisco la didattica, ma per quanto riguarda lo scopo "bisogno"? Non ti piace standard std :: string? – Nikko
Francamente, no. Sogno un codice che sia intelligente e facile da usare. Guardando CPlusplus.com ho notato che std :: string non può fare qualcosa del genere: string a = string ("Hello") + string ("world") o string a = String ("Hello") + "World" perché manca il sovraccarico +. E in più su questo devo lavorare molto con le stringhe in questa parte del mio progetto e quindi preferisco avere una che abbia tutte le funzioni che voglio e come voglio. Spero di non sentirmi indolenzito per aver detto questo. – Sanctus2099
Ciò che in realtà non si può fare è: str3 = "qwe" + "rty"; Nello standard l'operatore + è una funzione globale per le stringhe. Per me, è un errore da principiante ridefinire una std :: string solo perché la vuoi a modo tuo e non che ci sia un bisogno specifico. – Nikko