ciao a tutti,
ho creato una struttura dai insieme con un vettore booleano e a me sembra essere fatto bene. ho notato che quando testo i metodi ottengo dei risulatati non attesi. sto cercando di capire dove sia il problema ma non ne vengo a capo. io penso sia il compilòatore che mi ha voltato le spalle. potete dare voi un'occhiata e dirmi dov'è il problema (qualora ce ne fosse uno)?
posto i codici:

insiemev.h
codice:
#ifndef insiemev_h
#define insiemev_h

#include "insieme.h"
#include<iostream>
#include<stdlib.h>

using namespace std;

template<class tipoelem>
class insiemev : public insieme<tipoelem>
{
   public:
      insiemev(int);
      
      int card;
      
      void creainsieme();
      bool insiemevuoto();
      bool appartiene(tipoelem);
      void inserisci(tipoelem);
      void cancella(tipoelem);
      void unione(insiemev<tipoelem> &, insiemev<tipoelem> &);
      void intersezione(insiemev<tipoelem> &, insiemev<tipoelem> &);
      void differenza(insiemev<tipoelem> &, insiemev<tipoelem> &);
   
      void visualizzains();
   private:
      bool *set;
      int dimset;
};

#endif

template<class tipoelem>
void insiemev<tipoelem>::visualizzains()
{
   for(int i = 0; i < dimset; i++)
   {
      if(this->appartiene(i))
      {
         cout << i << "  ";
      }
   }
   cout << "\n\n";
}

template<class tipoelem>
insiemev<tipoelem>::insiemev(int dim)
{
   dimset = dim;
   this->creainsieme();
}

template<class tipoelem>
void insiemev<tipoelem>::creainsieme()
{
   set = new bool[dimset];
   for(int i = 0; i < dimset; i++)
      set[i] = false;
   card = 0;
}

template<class tipoelem>
bool insiemev<tipoelem>::insiemevuoto()
{
   return(card == 0);
}

template<class tipoelem>
bool insiemev<tipoelem>::appartiene(tipoelem elem)
{
   return(set[elem]);
}

template<class tipoelem>
void insiemev<tipoelem>::inserisci(tipoelem elem)
{
   if(!this->appartiene(elem))
   {
      set[elem] = true;
      ++card;
   }
}

template<class tipoelem>
void insiemev<tipoelem>::cancella(tipoelem elem)
{
   if(set[elem])
   {
      set[elem] = false;
      card--;
   }
}

template<class tipoelem>
void insiemev<tipoelem>::unione(insiemev<tipoelem> &A, insiemev<tipoelem> &B)
{
   for(int i = 0; i < dimset; i++)
   {
      if(A.appartiene(i) || B.appartiene(i))
         this->inserisci(i);
   }
}

template<class tipoelem>
void insiemev<tipoelem>::intersezione(insiemev<tipoelem> &A, insiemev<tipoelem> &B)
{
   for(int i = 0; i < card; i++)
   {
      if(A.appartiene(i) && B.appartiene(i))
         this->inserisci(i);
   }
}

template<class tipoelem>
void insiemev<tipoelem>::differenza(insiemev<tipoelem> &A, insiemev<tipoelem> &B)
{
   for(int i = 0; i < card; i++)
   {
      if(A.appartiene(i) && !B.appartiene(i))
         this->inserisci(i);
   }
}
testinsieme.cpp
codice:
#include "insiemev.h"
#include<iostream>
#include<stdlib.h>

using namespace std;

int main()
{
   cout << "                ***test insieme con vettore***\n\n";
   int dim = 10;                  
   insiemev<int> ins(dim);
   ins.inserisci(1);
   ins.inserisci(2);     
   ins.visualizzains();
   int dim2 = 5;
   insiemev<int> ins2(dim2);
   ins2.inserisci(4);
   ins2.inserisci(2);
   ins2.visualizzains();
   int card3 = dim + dim2;
   insiemev<int> ins3(card3);
   ins3.unione(ins, ins2);
   ins3.visualizzains();
   
   system("pause");
   return 0;
}
il problema è: quando testo il metodo unione dovrei ottenere come risultato l'insieme conelementi {1, 2, 4} mentre mi viene visualizzato {1, 2, 4, 6, 8, 9, 10, 11, 12, 13, 14}

cosa ho fatto di sbagliato? vi prego aiutatemi.