Sprawdzanie czy istnieje już obiekt

0

Cześc, Mam problem z projektem. Chcę aby przy dodawaniu wydarzenia na bieżąco tworzyło obiekty typu sala. W wydarzeniu ma sprawdzać czy istnieje (aby nie tworzyć sal o tym samym numerze) jeśli nie to tworzy nowy obiekt typu sala i ustawia numer sali na ten obiekt. Wolałbym żeby sprawdzało/dodawało sale przy tworzeniu wydarzenia a nie przed wywołaniem metody utworzwydarzenie

#include <iostream>
#include "Wydarzenie.h"
#include "Sala.h"

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
	Wydarzenie nowe;
	nowe.rezerwuj();
	nowe.rezerwuj();
	return 0;
}
#ifndef SALA_H
#define SALA_H

class Sala
{	int numer;
	bool zajeta;
	int ostatniasala;
	Sala *s;
	
	
	public:
		void utworzsale();
	
		void rezerwujsale();
		void anulujrezerwacjesali();
		void wyswietlsale();
		bool czyzajeta();
		bool czyistniejesala(int sprawdzanynumer);
		Sala();
		Sala(int n);
		~Sala();
	protected:
};

#endif

#include "Sala.h"
#include <iostream>
using namespace std;
Sala::Sala(){
	numer=0;
	
	zajeta=false;
	
	s=new Sala[ostatniasala];
	
}

Sala::Sala(int n){
	numer=n;
	
	zajeta=false;
	
	s=new Sala[ostatniasala];
	
}

Sala::~Sala(){
	delete [] s;
}

void Sala::utworzsale(){
	cout<<"Podaj numer sali";
	cin>>numer;
}

void Sala::rezerwujsale(){
	zajeta=true;
}

void Sala::anulujrezerwacjesali(){
	zajeta=false;
}

void Sala::wyswietlsale(){
	cout<<numer<<" "<<czyzajeta();
	
}

bool Sala::czyzajeta(){
	if(zajeta)
	return zajeta;
}

bool Sala::czyistniejesala(int sprawdzanynumer){
			for(int i=0;i<ostatniasala;i++){
				if(s[i].numer==sprawdzanynumer)
					return true;
			}
		}

#ifndef WYDARZENIE_H
#define WYDARZENIE_H
#include "Sala.h"
#include <string.h>
#include <iostream>
using namespace std;


class Wydarzenie
{
	string nazwa;
	int numersali;
	Sala s;
	public:
		void rezerwuj();
		void anulujrezerwacje();
		void wyswietl();
		Wydarzenie();
		~Wydarzenie();
	protected:
};

#endif
#include "Wydarzenie.h"
#include <iostream>

using namespace std;
Wydarzenie::Wydarzenie()
{
}

Wydarzenie::~Wydarzenie()
{
}

void Wydarzenie::rezerwuj(){
	cout<<"Podaj nazwe wydarzenia:";
	cin>>nazwa;
	cout<<"Podaj numer sali:";
	cin>>numersali;
	
	if(s.czyistniejesala(numersali))
		cout<<"Sala juz istnieje"<<endl;
	else s.utworzsale()	;
		
}

void Wydarzenie::anulujrezerwacje(){
	
}

void Wydarzenie::wyswietl(){
			
		}
1

Dlaczego w pojedynczej sali trzymasz listę sal?
Za zarządzanie salami powinien odpowiadać odrębny obiekt.

Btw, nie pisz kodu w języku polskim (po angielsku wygląda schludniej, czytelniej + w rzeczywistości i tak będziesz musiał pisać kod po angielsku).

0

Trzeba utworzyć nową klasę z wszystkimi salami?

1

Powinieneś podejść do tego w taki sposób:

class Sala {
  int numer;
  bool zajeta;

  /* ... */
}

class MenedzerSal {
  std::vector<Sala> sale;

  bool czySalaZajeta(int numerSali) {
    /* ... */
  }

  /* ... */
}
2

Zagadka, kiedy to skończy się wykonywać i jaka jest wartość ostatniasala?

Sala::Sala(){
    numer=0;
 
    zajeta=false;
 
    s=new Sala[ostatniasala];
 
}

Ogółem cały design nie ma dla mnie sensu.

0

Przejrzałem kilka stron o bibliotece STL i już udało mi się zastosować vector. Żeby nie zakładać kolejnego wątku, chcę do wydarzenia dodać datę rozpoczęcia i zakończenia i chciałbym żeby przy dodawaniu kolejnego wydarzenia nie kolidowały ze sobą w czasie i miejscu. W jaki sposób to można wykonać? Czy można tu jakoś użyć bibliotekę time.h do porównania dat,żeby nie porównywać kolejno dzień,miesiąc,godzina,minuta ? Czy może przeciążony operator do porównania obiektów data? Gdyby to była jedna data to poradziłbym sobie,ale w tym przypadku ma być przedział czasowy.

2

Myślę, że jednak lepiej będzie gdy zaimplementujesz własną strukturę

struct date
{
    int year;
    int month;
    int day;
};

Operator porównania możesz zaimplementować za pomocą https://dsp.krzaq.cc/post/245/jak-latwo-zaimplementowac-w-cxx-operator-porownania-dla-twojej-klasy/

bool operator<(date const& l, date const& r)
{
    return std::tie(l.year, l.month, l.day) < std::tie(r.year, r.month, r.day);
}

Jak chcesz bardziej to rozbudować, możesz stworzyć klasę date_range, która miałaby binarny operator &, zwracający intersekcję dat - wtedy sprawdzałbyś czy istnieje taki element, że (el & chciana_data).length() > 0, ale to już może być lekka przesada na potrzeby tego programu.

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