PDA

Visualizza la versione completa : [C++] Problema con operatore


{Bl4d3}
03-08-2005, 15:19
#include <stdio.h>
#include <strings.h>
#include <malloc.h>

class Stringa
{
public:
char *s;
int lunghezza;
public:
Stringa(void)
{
s = (char *)malloc(512);
s[0] = '\0';
lunghezza = 0;
}

Stringa(char *p)
{
s = (char *)malloc(512);
int i;
for (i = 0; (s[i] = p[i]) != '\0'; i++)
;
lunghezza = i;
}

Stringa(int k)
{
s = (char *)malloc(k);
s[0] = '\0';
lunghezza = 0;
}

Stringa(char *p, int k)
{
s = (char *)malloc(k);
int i;
for (i = 0; (s[i] = p[i]) != '\0'; i++)
;
lunghezza = i;
}

~Stringa(void)
{
s[0] = '\0';
lunghezza = 0;
}

void write(void)
{
printf("%s",s);
}

void writeln(void)
{
printf("%s\n",s);
}

int lung(void)
{
return lunghezza;
}

void input(void)
{
char c;
int i;
for (i = 0; (c = getchar()) != '\n'; i++)
s[i] = c;
s[i] = '\0';
lunghezza = i;
}

void modifica(int i, char c)
{
if (i > 0 && i <= lunghezza)
s[i-1] = c;
}

int operator==(Stringa &x)
{
return !(strcmp(s,x.s));
}

int operator==(char *x)
{
return !(strcmp(s,x));
}


int operator<(Stringa &x)
{
return (strcmp(s,x.s) == -1);
}

int operator<(char *x)
{
return (strcmp(s,x) == -1);
}


int operator>(Stringa &x)
{
return (strcmp(s,x.s) == 1);
}

int operator>(char *x)
{
return (strcmp(s,x) == 1);
}


int operator<=(Stringa &x)
{
return ((*this == x) || (*this < x));
}

int operator<=(char *x)
{
return ((*this == x) || (*this < x));
}


int operator>=(Stringa &x)
{
return ((*this > x) || (*this == x));
}

int operator>=(char *x)
{
return ((*this > x) || (*this == x));
}

Stringa operator+(Stringa &x)
{
Stringa z;
int i,k;
for (i = 0; s[i] != '\0'; i++)
z.s[i] = s[i];
for (k = 0; x.s[k] != '\0'; k++)
z.s[i++] = x.s[k];
z.s[i] = '\0';
z.lunghezza = i;
return z;
}

void operator+=(Stringa &x)
{
*this = *this + x;
}



void operator=(char *z)
{
int i;
for (i = 0; (s[i] = z[i]) != '\0'; i++)
;
lunghezza = i;
}
};

#include <stdlib.h>

int main()
{
system("cls");
Stringa a;
Stringa b;
Stringa c;
a.input();
b.input();
c = a + b;
printf("\n\n");
a.writeln();
b.writeln();
c.write();
}


salve, vorrei sapere perchè il codice sopra riportanto non funziona. Non stampa la stringa c.
Però se s lo metto come un array statico va tutto bene... qualcuno mi può aiutare?

Andrea Simonassi
03-08-2005, 16:16
Manca il costruttore per copia

Stringa(Stringa & str)
{
....
}

che viene chiamato in automatico quando copi un valore in un altro.

Altrimenti il valore che ritorni nel codice dell'operatore + viene distrutto prima di potere essere copiato nella variabile a cui fai l'assegnazione.


VEDI http://www.fredosaurus.com/notes-cpp/oop-condestructors/copyconstructors.html

{Bl4d3}
03-08-2005, 20:09
#include <stdio.h>
#include <strings.h>
#include <malloc.h>

class Stringa
{
public:
char *s;
int lunghezza;
public:
Stringa(void)
{
s = (char *)malloc(512);
s[0] = '\0';
lunghezza = 0;
}

Stringa(char *p)
{
s = (char *)malloc(512);
int i;
for (i = 0; (s[i] = p[i]) != '\0'; i++)
;
lunghezza = i;
}

Stringa(int k)
{
s = (char *)malloc(k);
s[0] = '\0';
lunghezza = 0;
}

Stringa(char *p, int k)
{
s = (char *)malloc(k);
int i;
for (i = 0; (s[i] = p[i]) != '\0'; i++)
;
lunghezza = i;
}

Stringa(const Stringa& x)
{
for (lunghezza = 0; lunghezza < x.lunghezza; lunghezza++)
s[lunghezza] = x.s[lunghezza];
}

~Stringa(void)
{
s[0] = '\0';
lunghezza = 0;
}

void write(void)
{
printf("%s",s);
}

void writeln(void)
{
printf("%s\n",s);
}

int lung(void)
{
return lunghezza;
}

void input(void)
{
char c;
int i;
for (i = 0; (c = getchar()) != '\n'; i++)
s[i] = c;
s[i] = '\0';
lunghezza = i;
}

void modifica(int i, char c)
{
if (i > 0 && i <= lunghezza)
s[i-1] = c;
}

int operator==(Stringa &x)
{
return !(strcmp(s,x.s));
}

int operator==(char *x)
{
return !(strcmp(s,x));
}


int operator<(Stringa &x)
{
return (strcmp(s,x.s) == -1);
}

int operator<(char *x)
{
return (strcmp(s,x) == -1);
}


int operator>(Stringa &x)
{
return (strcmp(s,x.s) == 1);
}

int operator>(char *x)
{
return (strcmp(s,x) == 1);
}


int operator<=(Stringa &x)
{
return ((*this == x) || (*this < x));
}

int operator<=(char *x)
{
return ((*this == x) || (*this < x));
}


int operator>=(Stringa &x)
{
return ((*this > x) || (*this == x));
}

int operator>=(char *x)
{
return ((*this > x) || (*this == x));
}

Stringa operator+(Stringa &x)
{
Stringa z;
int i,k;
for (i = 0; s[i] != '\0'; i++)
z.s[i] = s[i];
for (k = 0; x.s[k] != '\0'; k++)
z.s[i++] = x.s[k];
z.s[i] = '\0';
z.lunghezza = i;
return z;
}

void operator+=(Stringa &x)
{
*this = (*this + x);
}



void operator=(char *z)
{
int i;
for (i = 0; (s[i] = z[i]) != '\0'; i++)
;
lunghezza = i;
}
};

#include <stdlib.h>

int main()
{
system("cls");
Stringa a;
Stringa b;
Stringa c;
a.input();
b.input();
c = a + b;
printf("\n\n");
a.writeln();
b.writeln();
c.write();
}


L'ho modificato così... ma non mi va lo stesso... mi sapresti dire come fare?

{Bl4d3}
03-08-2005, 20:27
RISOLTO! thanks!

DydBoy
03-08-2005, 20:47
Ti dispiace postare la soluzione ? :)

{Bl4d3}
03-08-2005, 20:52
#include <stdio.h>
#include <strings.h>
#include <malloc.h>

class Stringa
{
private:
char *s;
int lunghezza;
int max;
public:
Stringa(void)
{
s = (char *)malloc(513);
s[0] = '\0';
lunghezza = 0;
max = 512;
}

Stringa(char *p)
{
s = (char *)malloc(513);
int i;
for (i = 0; (s[i] = p[i]) != '\0'; i++)
;
lunghezza = i;
max = 512;
}

Stringa(int k)
{
s = (char *)malloc(k+1);
s[0] = '\0';
lunghezza = 0;
max = k;
}

Stringa(char *p, int k)
{
s = (char *)malloc(k);
int i;
for (i = 0; (s[i] = p[i]) != '\0'; i++)
;
lunghezza = i;
max = k;
}

Stringa(const Stringa& x)
{
max = (x.lunghezza)+1;
s = (char *)malloc(max);
for (lunghezza = 0; lunghezza < x.lunghezza; lunghezza++)
s[lunghezza] = x.s[lunghezza];
}

~Stringa(void)
{
s[0] = '\0';
lunghezza = 0;
max = 0;
}

void write(void)
{
printf("%s",s);
}

void writeln(void)
{
printf("%s\n",s);
}

int lung(void)
{
return lunghezza;
}

void input(void)
{
char c;
int i;
for (i = 0; (c = getchar()) != '\n' && i < max; i++)
s[i] = c;
s[i] = '\0';
lunghezza = i;
fflush(stdin);
}

void modifica(int i, char c)
{
if (i > 0 && i <= lunghezza)
s[i-1] = c;
}

Stringa operator=(const Stringa& x)
{
strcpy(s,x.s);
lunghezza = x.lunghezza;
}

int operator==(Stringa &x)
{
return !(strcmp(s,x.s));
}

int operator==(char *x)
{
return !(strcmp(s,x));
}


int operator<(Stringa &x)
{
return (strcmp(s,x.s) == -1);
}

int operator<(char *x)
{
return (strcmp(s,x) == -1);
}


int operator>(Stringa &x)
{
return (strcmp(s,x.s) == 1);
}

int operator>(char *x)
{
return (strcmp(s,x) == 1);
}


int operator<=(Stringa &x)
{
return ((*this == x) || (*this < x));
}

int operator<=(char *x)
{
return ((*this == x) || (*this < x));
}


int operator>=(Stringa &x)
{
return ((*this > x) || (*this == x));
}

int operator>=(char *x)
{
return ((*this > x) || (*this == x));
}

Stringa operator+(Stringa &x)
{
Stringa z;
int i,k;
for (i = 0; s[i] != '\0'; i++)
z.s[i] = s[i];
for (k = 0; x.s[k] != '\0'; k++)
z.s[i++] = x.s[k];
z.s[i] = '\0';
z.lunghezza = i;
return z;
}

void operator+=(Stringa &x)
{
*this = (*this + x);
}



void operator=(char *z)
{
int i;
for (i = 0; (s[i] = z[i]) != '\0'; i++)
;
lunghezza = i;
}
};


eccola...

nel costruttore di copia non allocavo e poi non c'era l'operatore= (Stringa)

Loading