Wyrzucanie wyjątków c++

0

Witam, zabrałem się za pisanie dosyć banalnego projektu aczkolwiek stanąłem w martwym punkcie. Potrzebuje stworzyć dla mojego projektu wyrzucanie wyjątków, aczkolwiek poradniki w sieci nie dają mi zbyt wiele bo jestem początkującym w temacie c++ i cały kod niewiele mi mówi jak to wszystko działa. Czy byłby ktoś w stanie stworzyć dla mojego przykładu wyrzucanie wyjątków abym mógł zobaczyć jak to wszystko działa? Chciałbym aby wyrzucało mi wyjątek(i np dawało dowolną godzinę do programu,, lub komentarz ze zły zakres i ponowne wpisanie), kiedy ktoś poda godzinę poza zakresem [0-23].

Oto mój kod który napisałem do tej pory.

#include <iostream>
using namespace std;

class Time{
private:
	int hours;
	int minutes;	
public:
		Time(){			
		hours = 5;
		minutes =55;
}
Time(int h, int m){		
		hours = h;
		minutes = m;
	}

	int get_hours() const{
		return hours;
	}
	int get_minutes() const{
		return minutes;
	}
	//setters
	void set_hours(int h){
		hours = h;
	}
	void set_minutes(int m){
		minutes = m;
	}
	
	Time operator-(const Time& t2)
{
Time result;
int all_minutes= (this->hours-t2.hours )*60 + this->minutes- t2.minutes;
result.hours = all_minutes/60; 
result.minutes = all_minutes%60; 
return result;
}


friend ostream& operator<<(ostream& os, const Time& t){
	      os<<"(" <<t.hours<<":";
		  os<<t.minutes<<")";
	      return  os; 

}
};

int main(){
	Time t1(5,55);
	Time t2(2,25);
	cout<<t1<<endl;
	cout<<t2<<endl;
	Time t3 = t1-t2;
	cout<<"Time difference between t1 & t2 = "<<t3<<endl;
}

1

Inny program ale zobaczysz działanie:

class pojazd
{
public:
	pojazd();
	~pojazd();
	virtual void jedz(int odleglosc) = 0;
private:

};

pojazd::pojazd(){}

pojazd::~pojazd(){}

class rower:public pojazd
{
public:
	rower();
	~rower();
	virtual void jedz(int odleglosc) {
//musisz dać jakiś warunek po którym nastąpi wyrzucenie wyjątku tak jak tu: if(){throw wyjątek}
		if (odleglosc > 10) {
			throw std::exception("Za daleko!");
		}
//i później za pomocą catch możesz obsłużyć ten wyjątek nie przerywając pracy programu, np gdy wartość jest nie poprawna ustawiasz jakąś domyślną co tam zechcesz robisz z tym
	}
private:

};

W Twoim przypadku powinieneś sprawdzać warunki w konstruktorze:

Time(int h, int m){     
if((h>0&&h<24)|| (m>0 &&m<60)){
throw  std::overflow_error("Bledne dane");
}
        hours = h;
        minutes = m;
    }

Napisane na szybko, chyba zadziała.

0

Sprawdzanie w konstruktorze oznacza to że jeżeli stworzę nowy obiekt i podam tam zakres większy/mniejszy niż [0-23] to wtedy wywoła mi błąd? Jeżeli tak, to dokładnie o to mi chodziło po dłuższym zastanowieniu się.

W tym co Pan stworzył

if(h<0&&h>24)

zamieniłem > oraz <, powinny być w drugą stronę(chyba) no i pisane na szybko(rozumiem ;))
aczkolwiek nie mogę sprawdzić czy to działa ponieważ wyskakuje mi błąd : [Error] 'overflow_error' is not a member of 'std'

1

To u mnie działa:

#include <iostream>
using namespace std;

class Time {
private:
	int hours;
	int minutes;
public:
	Time() {};
	Time(int h, int m) {
		if ((h < 0 || h > 24) || (m < 0 || m > 60)) {
			throw std::overflow_error("zle");
		}
		else {
			hours = h;
			minutes = m;
		}
	}

	int get_hours() const {
		return hours;
	}
	int get_minutes() const {
		return minutes;
	}
	//setters
	void set_hours(int h) {
		hours = h;
	}
	void set_minutes(int m) {
		minutes = m;
	}

	Time operator-(const Time& t2)
	{
		int all_minutes = (this->hours - t2.hours) * 60 + this->minutes - t2.minutes;
		//tu zmieniłem bo fajnie by było skorzystać z konstuktora który spwradzi nam poprawność
		//liczb, nie jest to tu wybitnie potrzebne, ale można 
		Time result(all_minutes / 60,( all_minutes % 60));
		return result;
	}

	friend ostream& operator<<(ostream& os, const Time& t) {
		os << "(" << t.hours << ":";
		os << t.minutes << ")";
		return  os;

	}
};

int main() {
	Time t1(23, 11);
	Time t2(2, 225);
	cout << t1 << endl;
	cout << t2 << endl;
	Time t3 = t1 - t2;
	cout << "Time difference between t1 & t2 = " << t3 << endl;
	return 0;
}
0

Faktycznie, mi też działa..coś mi program nie przyjmuje, ale jak zmieniłem na inny to już wszystko jest tak jak powinno. Bardzo dziękuje za pomoc.

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