Klasa modelująca zbiór elementów

Kolejny projekt przedmiot Programowanie Obiektowe. Zadanie brzmi następująco:

Stworzyć klasę modelującą zbiór elementów np. zbiór
A = { 1, 12, 16, 4, 5, 7, 7, 12, 3}

Umożliwić operacje na obiektach tej klasy, takie jak np.:

  1. suma zbiorów: suma A i B = { 0, 1, 4, 5, 8, 12, 16 }
  2. część wspólna: część wspólna A i B = { 5, 16 }
  3. wyprowadzania na urządzenie zewnętrzne
  4. wczytywania z urządzenia zewnętrznego.

Oraz inne operacje.

Przetestować podaną klasę.

Przygotowałem następującą klasę. Wiem, że ma ona kilka błędów i mogła by być doskonalsza. Niestety zabrakło mi już czasu na poprawki. Sesja trwa a przedmioty trzeba zaliczać ;)

zbior.h

/*
 * Grzegorz Bernaś
 *
 * OS: Ubuntu Linux
 * Powered by Eclipse 3.1.2
 *
 * Copyright (C) 2006 Grzegorz Bernaś
 * Version 0.8
 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL
 * Zgadula is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 */

#ifndef _ZBIOR_H_
#define _ZBIOR_H_

#include <iostream>

using namespace std;

class zbior
{
	private:
		/*
		 * int * zbiorLiczb;
		 * zmienna przechowuje zbior liczb w postaci tablicy
		 */
		int * zbiorLiczb;
		int zbiorNElementow;

	public:
		/*
		 * zbior();
		 * tu będzie wywoływana metoda czytajZbior aby pobrać dane z klawiatury
		 */
		zbior();

		/*
		 * zbior(int z[], int e);
		 * przeciążenie konstruktora dla dodawania
		 */
		 zbior(int z[], int e);

		/*
		 * ~zbior();
		 * destruktor
		 */
		~zbior();

		/*
		 * void czytajZbior();
		 * metoda pobiera dane wpisane przez użytkownika jak elementy zbioru
		 * przykład: 1 [enter], 2 [enter] ...
		 */
		void czytajZbior();

		/*
		 * ostream &operator<<(const zbior &z);
		 * drukuje na ekran zbiór w postacie A = {1,2}
		 */
		friend ostream& operator<< (ostream& wyjscie, const zbior &z);

		/*
		 * zbior operator*(zbior cwzbr);
		 * drukuje na ekran część wpólną dla dwóch zbiorów
		 * oraz przypisuje A część wspólną z A i B
		 * np. A = A*B
		 */
		zbior operator*(const zbior & cwzbr);

		/*
		 * zbior operator+(zbior zbr);
		 * operator sumowania dwóch zbiorów
		 */
		zbior operator+(const zbior & zbr);
};

#endif //_ZBIOR_H_

zbior.cpp

/*
 * Grzegorz Bernaś
 *
 * OS: Ubuntu Linux
 * Powered by Eclipse 3.1.2
 *
 * Copyright (C) 2006 Grzegorz Bernaś
 * Version 0.8
 * License http://www.gnu.org/copyleft/gpl.html GNU/GPL
 * Zgadula is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 */

#include "zbior.h"
#include <iostream>
#include <algorithm>

using namespace std;

zbior::zbior()
{
	cout << "Podaj ilość elementów zbioru: ";
	cin >> zbiorNElementow;
	zbiorNElementow;
	zbiorLiczb = new int [zbiorNElementow] ;
	czytajZbior();
}

zbior::zbior(int z[], int e)
{

	zbiorNElementow = e ;
	zbiorLiczb = new int [zbiorNElementow] ;

	for(int i = 0; i <= e-1; i++)
	{
		//cout << "DEBUG: zbiorLiczb[" << i << "]: " << z[i] << endl;
		zbiorLiczb[i] = z[i];
	}

}

zbior::~zbior()
{
	//cout << "DEBUG: destructor call" << endl;

	//delete [] zbiorLiczb;
}

void zbior::czytajZbior()
{
	int i = 0;
	while ( i <= zbiorNElementow-1 )
	{
		cout << "Podaj " << i << " element zbioru: ";
		cin >> zbiorLiczb[i];

		i++;
	}
}

ostream& operator<< (ostream& wyjscie, const zbior &z)
{
   wyjscie << "{";
   for(int i = 0; i <= z.zbiorNElementow-1; i++)
   {
     wyjscie << z.zbiorLiczb[i];

     if(i != z.zbiorNElementow-1)
     	wyjscie << ",";
   }
   wyjscie << "}" << endl;
   return wyjscie;
}

zbior zbior::operator*(const zbior & cwzbr)
{
	//cout << "DEBUG: operator* starts" << endl;

	int * buffor;
	int bKeys; // Maksymalna ilość elementów w tablicy
	int bKey = 0; // Iteracja tablicy wspólnej

	// Przypisz ile maksymalnie może zająć tablica (tyle ile ma najmniejszy zbiór)
	if(zbiorNElementow < cwzbr.zbiorNElementow)
		bKeys = zbiorNElementow;
	else
		bKeys = cwzbr.zbiorNElementow;

	//cout << "DEBUG: bKeys(" << bKeys << ")" << endl;

	buffor = new int [bKeys];

	for (int i = 0; i <= zbiorNElementow-1; i++)
	{
		//cout << "DEBUG: operator*; for 1" << endl;

		for (int j = 0; j <= cwzbr.zbiorNElementow-1; j++)
		{
			//cout << "DEBUG: for2" << endl;
			if(zbiorLiczb[i] == cwzbr.zbiorLiczb[j])
			{
				//cout << "DEBUG: for2 {if}" << endl;

				buffor[bKey] = zbiorLiczb[i];
				bKey++;
			}
		}
	}

	//cout << "DEBUG: operator* ends" << endl;

	//cout << "DEBUG: buffor(" << buffor << ") il.elemen("<< bKey-1 << ")" << endl;

	zbior temp(buffor,bKey);

	return temp;
}

zbior zbior::operator+(const zbior & zbr)
{
	//cout << "DEBUG: operator+ starts" << endl;

	int * buffor;
	int bKeys; // Maksymalna ilość elementów w tablicy
	int bKey = 0; // Iteracja tablicy wspólnej

	// Przypisz ile maksymalnie może zająć tablica
	bKeys = zbiorNElementow + zbr.zbiorNElementow;

	//cout << "DEBUG: bKeys(" << bKeys << ")" << endl;

	buffor = new int [bKeys];

	for (int x = 0; x <= zbiorNElementow-1; x++)
	{
		buffor[bKey] = zbiorLiczb[x];
		bKey++;
	}

	for (int i = 0; i <= zbr.zbiorNElementow-1; i++)
	{
		//cout << "DEBUG: operator*; for 1" << endl;

		for (int j = 0; j <= zbiorNElementow-1; j++)
		{
			if(zbiorLiczb[j] == zbr.zbiorLiczb[i])
				break;
			else if((zbiorLiczb[j] != zbr.zbiorLiczb[i]) && (j == zbiorNElementow-1))
			{
				buffor[bKey] = zbr.zbiorLiczb[i];
				bKey++;
			}
		}
	}

	//cout << "DEBUG: operator* ends" << endl;

	//cout << "DEBUG: buffor(" << buffor << ") il.elemen("<< bKey-1 << ")" << endl;

	zbior temp(buffor,bKey);

	return temp;
}

int main()
{
	zbior A;
	zbior B;

	cout << endl;

	cout << "Zbiór A=" << A;
	cout << "Zbiór B=" << B;

	cout << endl;

	zbior C = A*B;
	cout << "Operacja C = A*B wygenerowała zbiór: " << C ;

	cout << endl;

	int liczba = 3;
	int array[3] = {23,32,11};
	zbior D(array,liczba);
	cout << "Zbiór D=" << D;

	int liczba2 = 3;
	int array_2[3] = {11,22,33};
	zbior E(array_2,liczba2);
	cout << "Zbiór E=" << E;

	cout << endl;

	D = E * D;
	cout << "Operacja D = E * D wygenerowała zbiór: " <<  D;

	cout << endl;

	cout << "Zbiór D=" << D;

	cout << endl;

	D = E + D;
	cout << "Operacja D = E + D wygenerowała zbiór: " << D;

	cout << endl;

	cout << "//-----\tPodstumowanie\t-----//" << endl;

	cout << "Zbiór A=" << A;
	cout << "Zbiór B=" << B;
	cout << "Zbiór C=" << C;
	cout << "Zbiór D=" << D;
	cout << "Zbiór E=" << E;
}