Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Wyrzucanie wyjątków podczas tworzenia obiektu

Ostatnio zmodyfikowano 2017-05-07 22:36
Autor Wiadomość
markosss
Temat założony przez niniejszego użytkownika
[C++] Wyrzucanie wyjątków podczas tworzenia obiektu
» 2017-05-07 13:26:56
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] podczas tworzenia nowego obiektu.

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

#include <iostream>
#include <string>
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;
}

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;
}

/*int ZleMinuty(int h, int m){    
if(h<0&&h>24){
throw ("Bledne dane");
}
        hours = h;
        minutes = m;
    }*/

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;
std::cout<<"Roznica w czasie pomiędzy t1 i t2 = "<<t3<<endl;
}

P-160786
karambaHZP
» 2017-05-07 19:48:44
<cassert> powinno wystarczyć do ogarnięcia wartości poza zakresem.
» standard Ccassert (assert.h)
P-160820
czaffik
» 2017-05-07 22:36:51
Możesz zrobić tak:

C/C++
class Time
{
    -----------------------------------------------------------------------------------------------------------
public:
    Time( int h, int m )
    {
        set_hours( h );
        set_minutes( m );
    }
   
    void set_hours( int h )
    {
        hours = h;
        if( hours > 24 || hours < 0 ) throw string( "godzina nie miesci sie w przedziale 0-24" );
       
    }
   
    void set_minutes( int m )
    {
        minutes = m;
        if( minutes > 59 || minutes < 0 ) throw string( "minuty nie mieszcza sie w przedziale 0-59" );
       
    }
};

-----------------------------------------------------------------------------------------------------------

int main()
{
    try
    {
        Time t1( 25, 55 );
        Time t2( 2, 25 );
       
        cout << t1 << "\n";
        cout << t2 << "\n";
       
        Time t3 = t1 - t2;
        std::cout << "Roznica w czasie pomiędzy t1 i t2 = " << t3 << endl;
    }
    catch( string error )
    {
        cout << error << "\n";
    }
}

Tylko takie kombinacje spowodują ze program ci powie ze coś poszło nie tak i zakończy działanie, (oczywiście możesz też zastosować trykacza tak żeby nie kończyć aplikacji) więc przydaje się w przypadkach gdy jakaś operacja ważna dla działania aplikacji poszła nie tak i chcesz wiedzieć co to było, np jakaś tekstura się nie wczytała i wypisujesz nazwę tekstury oraz np funkcję w jakiej to wczytywanie następuje.

Po drugie nie wiem czy rzucanie stringami to dobry pomysł, coś tam czytałem że najlepiej pisać własne wyjątki, ale to musisz sam poczytać albo ktoś lepiej obeznany się wypowie, może, jeszcze.
P-160825
« 1 »
  Strona 1 z 1