Passa al tema normale
Discussioni su argomenti di Informatica

Regole del forum

Consulta il nostro regolamento e la guida per scrivere le formule
Rispondi al messaggio

[C++] Classi ed intersezione

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;

Re: [C++] Classi ed intersezione

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?

Re: [C++] Classi ed intersezione

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;
}

Re: [C++] Classi ed intersezione

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?
Rispondi al messaggio


Skuola.net News è una testata giornalistica iscritta al Registro degli Operatori della Comunicazione.
Registrazione: n° 20792 del 23/12/2010.
©2000— Skuola Network s.r.l. Tutti i diritti riservati. — P.I. 10404470014.