Przeciążenie operatorów można zasadniczo obsłużyć na dwa sposoby - z użyciem funkcji składowych klasy (Listing 1) lub z użyciem funkcji zaprzyjaźnionych z klasą (Listing 2). Sposób przeciążenia operatora wypisywania << przedstawiono na Listingu 3.
Listing 1 Przeciążone operatory dodawania i odejmowania obiektów klasy Point - użycie funkcji składowych klasy
class Point {
public:
Point (int x, int y) {Point::x = x; Point::y = y;}
Point operator + (Point &p) {return Point(x + p.x,y + p.y);}
Point operator - (Point &p) {return Point(x - p.x,y - p.y);}
private:
int x, y;
};
Listing 2 Przeciążone operatory dodawania i odejmowania obiektów klasy Point - użycie funkcji zaprzyjaźnionych z klasą
class Point {
public:
Point (int x, int y) {Point::x = x; Point::y = y;}
friend Point operator + (Point &p, Point &q)
{return Point(p.x + q.x,p.y + q.y);}
friend Point operator - (Point &p, Point &q)
{return Point(p.x - q.x,p.y - q.y);}
private:
int x, y;
};
Listing 3 Przeciążenie operatora <<
class Binary {
//...
friend ostream& operator << (ostream&, Binary&);
};
ostream& operator << (ostream &os, Binary &n)
{
char str[binSize + 1];
strncpy(str, n.bits, binSize);
str[binSize] = '\0';
os << str;
return os;
}
Proszę przeładować i przetestować dla klasy Point operator >. Zakładamy, że obiekt P1 klasy Point jest > od obiektu P2 klasy Point jeśli jego odległość od początku układu jest większa.
Proszę zaimplementować i przetestować klasę Set, w której operacje na zbiorach wykonywane są przy użyciu przeciążonych operatorów, a nie funkcji składowych. Definicja klasy jest następująca:
#include <iostream.h>
const maxCard = 100;
enum Bool {false, true};
class Set {
public:
Set (void) { card = 0; }
friend Bool operator & (const int, Set&); // membership
friend Bool operator == (Set&, Set&); // equality
friend Bool operator != (Set&, Set&); // inequality
friend Set operator * (Set&, Set&); // intersection
friend Set operator + (Set&, Set&); // union
void RemovElem (const int);
void AddElem (const int elem);
void Copy (Set &set);
friend ostream& operator << (ostream &os, Set&a);
private:
int elems[maxCard]; // set elements
int card; // set cardinality
};
Proszę przeciążyć również:
Operator - różnica dwóch zbiorów (n.p. s - t jest zbiorem zawierającym elementy z s których nie ma w t).
Operator <= sprawdza relację zawierania (n.p. s <= t zwraca prawdę jeżeli wszystkie elementy s są również w t).
Na poniższym listingu zdefiniowano prostą klasę tablicy asocjacyjnej. Tablica asocjacyjna jest jednowymiarową tablicą indeksowaną danymi o typie, który może być różny od całkowitego. W szczególności, w klasie AssocVec, każdy element jest indeksowany napisem, który służy do uzyskania wartości tego elementu.
#include <iostream.h>
#include <string.h>
class AssocVec {
public:
AssocVec (const int dim);
~AssocVec (void);
int& operator [] (const char *idx);
private:
struct VecElem {
char *index;
int value;
} *elems; // vector elements
int dim; // vector dimension
int used; // elements used so far
};
Użycie klasy AssocVec może wyglądać następująco:
AssocVec count(5);
count["apple"] = 5;
count["orange"] = 10;
count["fruit"] = count["apple"] + count["orange"]; // result 15
Proszę zaimplementować i przetestować klasę AssocVec tak, aby operacje na tablicy asocjacyjnej były możliwe.