Witam:)
Potrzebuję pomocy w dokończeniu programu wykorzystującego szablony klas. Na początek powiem w czym tkwi problem i co już udało mi się zrobić. Program służy do obsługi sali w restauracji. Klasa Room reprezentuje salę, na której znajduje się 10 stolików (Table). Przy każdym stoliku może siedzieć co najwyżej 4 pary (Marriage). Udało już mi się stworzyć większość elementów programu:
- klasa Person reprezentująca osoby
- klasa szablonowa Pair za pomocą której definiuję pary siedzące przy stolikach
- klasa szablonowa Array za pomocą której definiuję stoliki
- klasa szablonowa Set reprezentująca zbiór, który ma co najwyżej N elementów
Potrzebuję jeszcze klasy Room, która będzie zawierała:
- konstruktor
- metodę zwracającą informację o wszystkich parach siedzących na sali (wszytkich par jest co najwyżej N*D, czyli liczba par przy stoliku razy liczba stolików). Wartością funkcji jest zbiór par małżeństwo/numerStolika.
Set<Marriage,N*D> getPairs() const ;
- metody wyszukiwania stoliku, przy którym siedzi para o określonych nazwiskach (w przypadku zbieżności nazwisk - czyli sytuacji, w której są dwie pary o tych samych nazwiskach - zwracamy pierwszą znalezioną parę)
Pair<Marriage*,int> find(const std::string& surname1, const std::string& surname2) const ;
- metody zwracającej zbiór wszystkich par o określonych nazwiskach wraz z numerami stolików, przy których siedzą
Set< Pair<Marriage*,int>, N*D > findAll(const std::string& surname1, const std::string& surname2) const ;
Proszę o pomoc, bo kompletnie nie wiem jak to teraz wszystko pozbierać do kupy w klasie Room. A oto co już mam:
#ifndef __PAIR_H__
#define __PAIR_H__
template<class T1, class T2>
struct Pair
{
Pair();
Pair(const T1& a_first, const T2& a_second);
T1 first;
T2 second;
};
template<class T1, class T2>
Pair<T1,T2>::Pair()
: first(T1()), second(T2())
{
}
template<class T1, class T2>
Pair<T1,T2>::Pair(const T1& a_first, const T2& a_second)
: first(a_first), second(a_second)
{
}
template<class T1, class T2>
std::ostream& operator<< (std::ostream& out, const Pair<T1,T2>& a_pair)
{
out <<"("<< a_pair.first<< ";"<< a_pair.second<<")";
return out;
}
#endif
#include <string>
#include <ostream>
#ifndef __PERSON_H__
#define __PERSON_H__
class Person
{
public:
Person(
const std::string& a_name,
const std::string& a_surname,
const std::string& a_pesel
) : m_name(a_name),
m_surname(a_surname),
m_pesel(a_pesel)
{
}
std::string getName() const
{
return m_name;
}
std::string getSurname() const
{
return m_surname;
}
std::string getPesel() const
{
return m_pesel;
}
void setName(const std::string& a_name)
{
m_name= a_name;
}
void setSurname(const std::string& a_surname)
{
m_surname= a_surname;
}
void setPesel(const std::string& a_pesel)
{
m_pesel= a_pesel;
}
private:
std::string m_name;
std::string m_surname;
std::string m_pesel;
};
inline
std::ostream& operator<< (std::ostream& out, const Person& a_person)
{
out <<"["<<a_person.getName();
out <<","<<a_person.getSurname();
out <<","<<a_person.getPesel()<< "]";
}
#endif
#include <stdexcept>
#ifndef __ARRAY_H__
#define __ARRAY_H__
template<class T, int CAPACITY>
class Array
{
public:
T& operator[] (int index)
{
testIndex(index);
return m_data[index];
}
const T& operator[] (int index) const
{
testIndex(index);
return m_data[index];
}
int capacity() const
{
return CAPACITY;
}
private:
void testIndex (int index) const
{
if(index <0 || index >= CAPACITY)
throw std::out_of_range("Array::operator[] - index out of range");
}
T m_data[CAPACITY];
};
#endif
#include "Array.h"
#ifndef __SET_H__
#define __SET_H__
template<class T, int CAPACITY>
class Set
{
public:
Set() : m_size(0) {}
// ma umozliwiac wstawianie elementu do zbioru na pierwsze wolne miejsce (w przypadku braku miejsca zwraca false)
bool insert(const T& element)
{
getElements()[m_size++]= element;
}
// ma zwracac faktyczna ilosc elementow w zbiorze
int size() const
{
return m_size;
}
Array<T,CAPACITY>& getElements()
{
return this->m_elements;
}
// ma zwracac element na podanej pozycji lub NULL, jesli podana pozycja jest nieprawidlowa
T& operator[](int index)
{
if(index<0 || index>=size())
throw std::out_of_range("Size::operator[] - index out of range");
return this->getElements()[index];
}
private:
Array<T,CAPACITY> m_elements;
int m_size;
};
#endif
#include "Set.h"
#ifndef __ROOM_H__
#define __ROOM_H__
class Room
{
public:
const static int N = 10;
const static int D = 4;
typedef Pair<Person,Person> Marriage;
typedef Array<Marriage*,D> Table;
typedef Array<Table,10> Room;
Set<Marriage,N*D> getPairs() const ;
Pair<Marriage*,int> find(const std::string& surname1, const std::string& surname2) const ;
Set< Pair<Marriage*,int>, N*D > findAll(const std::string& surname1, const std::string& surname2) const ;
private:
Array<Table,10> m_tables;
};
#endif