[C++] Classi ed intersezione

Messaggioda maxira » 18/07/2019, 22:16

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.

Codice:
#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;
maxira
Average Member
Average Member
 
Messaggio: 141 di 590
Iscritto il: 24/10/2018, 15:12

Re: [C++] Classi ed intersezione

Messaggioda Super Squirrel » 19/07/2019, 14:19

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?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 367 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Classi ed intersezione

Messaggioda maxira » 20/07/2019, 16:16

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?

Codice:
#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;
}
maxira
Average Member
Average Member
 
Messaggio: 142 di 590
Iscritto il: 24/10/2018, 15:12

Re: [C++] Classi ed intersezione

Messaggioda Super Squirrel » 21/07/2019, 11:01

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?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 368 di 1486
Iscritto il: 16/05/2013, 22:05


Torna a Informatica

Chi c’è in linea

Visitano il forum: utente__medio e 1 ospite