Program z szablonami klas - pomoc w dokończeniu

0

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:

  1. klasa Person reprezentująca osoby
  2. klasa szablonowa Pair za pomocą której definiuję pary siedzące przy stolikach
  3. klasa szablonowa Array za pomocą której definiuję stoliki
  4. 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
0

a jakie bledy dostajesz i/lub czego nie rozumiesz?

0

Program nie wywala żadnych błędów. Kompiluje się i działa prawidłowo, tzn. tworzy osoby, łączy je w pary i sadza je przy stolikach. Po prostu nie wiem jak stworzyć klasę Room (sala z 10 stolikami, przy każdym stoliku można posadzić co najwyżej cztery pary), która będzie zawierała konstruktor i trzy funkcje których definicje i działanie opisałem powyżej. Zacząłem pisać tą klasę (kod na samym dole), ale nie wiem jak ją skończyć... Proszę o pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1