[C++] Classi ed intersezione
Ho un vettore di istanze di una classe e non riesco a far funzionare l'operatore & (che in teoria dovrebbe darmi il vettore intersezione). Il programma compila, ma non stampa niente.
Grazie a chi darà un'occhiata.
Grazie a chi darà un'occhiata.
#include <iostream> #include <string.h> using namespace std; class oggetto{ friend ostream& operator<<(ostream& os, const oggetto& o){return o.stampa(os);} private: int n; char* testo; public: oggetto(){n=0; testo=new char[1]; strcpy(testo, "");} oggetto(const int x, const char* c){n=x; testo=new char[strlen(c)+1]; strcpy(testo, c);} bool operator==(const oggetto& o) const{return(o.n==n && !strcmp(o.testo, testo));} const oggetto& operator=(const oggetto& o){ if(this!=&o){ n=o.n; if(testo) delete [] testo; testo=new char[strlen(o.testo)+1]; strcpy(testo, o.testo); } return *this; } ~oggetto(){delete [] testo; n=0;} ostream& stampa(ostream& os) const{os << n << " " << testo; return os;} }; typedef oggetto T; class vettore{ friend ostream& operator<<(ostream& os, const vettore& o){return o.stampa(os);} private: static const int N=4; T vett[N]; int nelem; public: vettore(){nelem=0;} bool ricerca(const T& e) const{ bool trovato=false; for(int i=0; i<nelem; i++){ if(e==vett[i]) trovato=true; break; } return trovato; } bool full() const{return nelem==N;} const vettore& operator=(const vettore& v){ if(this!=&v){ for(int i=0; i<v.nelem; i++) vett[i]=v.vett[i]; } return *this; } bool insert(const T& e){ if(full()) return false; vett[nelem]=e; nelem++; return true; } const vettore operator&(const vettore& v) const{ vettore ris; for(int i=0; i<v.nelem; i++){ if(ricerca(v.vett[i])) ris.insert(v.vett[i]); } return ris; } ostream& stampa(ostream& os) const{ for(int i=0; i<nelem; i++) os << vett[i] << " "; return os; } }; int main(){ oggetto o1(4, "ciao"); oggetto o2(5, "hola"); oggetto o3(6, "salut"); oggetto o4(7, "halo"); vettore v1,v2, v3; v1.insert(o1); v1.insert(o2); v2.insert(o3); v2.insert(o1); v3=v1&v2; //l'intersezione dovrebbe contenere o1 cout << v3;
Risposte
Ci sarebbero varie cose da dire dal punto di vista "stilistico"... per esempio qual è l'utilità delle funzioni stampa()?
In ogni caso i problemi sono 2:
- nella funzione ricerca() non manca qualche graffa?
- nell'overload dell'operatore di assegnazione della classe vettore non stai dimenticando di assegnare qualche dato-membro?
In ogni caso i problemi sono 2:
- nella funzione ricerca() non manca qualche graffa?
- nell'overload dell'operatore di assegnazione della classe vettore non stai dimenticando di assegnare qualche dato-membro?
La funzione stampa sta lì solo perché nel programma originale la classe oggetto era una classe base e c'era un "virtual" prima di stampa. Modificandolo ho solo tolto il "virtual" e ho dimenticato di eliminare la funzione stampa e lasciare solo l'operatore <<.
Sul resto, hai ragione. Puoi dirmi adesso se questo codice è corretto?
Sul resto, hai ragione. Puoi dirmi adesso se questo codice è corretto?
#include <iostream> #include <string.h> using namespace std; class oggetto{ friend ostream& operator<<(ostream& os, const oggetto& o){os << o.n << " " << o.testo; return os;} private: int n; char* testo; public: oggetto(){n=0; testo=new char[1]; strcpy(testo, "");} oggetto(const int x, const char* c){n=x; testo=new char[strlen(c)+1]; strcpy(testo, c);} bool operator==(const oggetto& o) const{return(o.n==n && !strcmp(o.testo, testo));} const oggetto& operator=(const oggetto& o){ if(this!=&o){ n=o.n; if(testo) delete [] testo; testo=new char[strlen(o.testo)+1]; strcpy(testo, o.testo); } return *this; } ~oggetto(){delete [] testo; n=0;} }; typedef oggetto T; class vettore{ friend ostream& operator<<(ostream& os, const vettore& o) { for(int i=0; i<o.nelem; i++) os << o.vett[i] << " "; return os;} private: static const int N=4; T vett[N]; int nelem; public: vettore(){nelem=0;} bool ricerca(const T& e) const{ bool trovato=false; for(int i=0; i<nelem; i++){ if(e==vett[i]){ trovato=true; break; } } return trovato; } bool full() const{return nelem==N;} const vettore& operator=(const vettore& v){ if(this!=&v){ for(int i=0; i<v.nelem; i++) vett[i]=v.vett[i]; nelem=(v.nelem); } return *this; } bool insert(const T& e){ if(full()) return false; vett[nelem]=e; nelem++; return true; } const vettore operator&(const vettore& v) const{ vettore ris; for(int i=0; i<v.nelem; i++){ if(ricerca(v.vett[i])) ris.insert(v.vett[i]); } return ris; } }; int main(){ oggetto o1(4, "ciao"); oggetto o2(5, "hola"); oggetto o3(6, "salut"); oggetto o4(7, "halo"); vettore v1,v2, v3; v1.insert(o1); v1.insert(o2); v2.insert(o3); v2.insert(o1); v3=v1&v2; cout << v3; }
Le modifiche che hai apportato sono corrette.
Un paio di osservazioni:
- al fine di rendere il codice più chiaro e leggibile, ti consiglio di rispettare la spaziatura e l'indentazione, di racchiudere sempre il corpo delle istruzioni di controllo (anche se costituito da una sola riga di codice) all'interno di parentesi graffe e di inserire una sola istruzione per riga;
- sei cosciente del fatto che se v2 contiene elementi che si ripetono, essi saranno ripetuti anche all'interno di un'eventuale intersezione?
Un paio di osservazioni:
- al fine di rendere il codice più chiaro e leggibile, ti consiglio di rispettare la spaziatura e l'indentazione, di racchiudere sempre il corpo delle istruzioni di controllo (anche se costituito da una sola riga di codice) all'interno di parentesi graffe e di inserire una sola istruzione per riga;
- sei cosciente del fatto che se v2 contiene elementi che si ripetono, essi saranno ripetuti anche all'interno di un'eventuale intersezione?