Carnage2k Temat założony przez niniejszego użytkownika |
[c++] klasa wylapywanych_wyjatkow » 2014-05-13 15:10:14 witam. Nie wiem jak zrobic osobna klase, ktora bedzie wylapywac wyjatek przelania z jednego pojemnika do drugiego (metoda dolej). ponizej zamieszczam moj program z wyjatkami: #include <iostream> #include <string>
using namespace std;
class Pojemnik { protected: string m_strNazwa; int m_nJednostka; double m_dPojemnosc; double m_dZajete; public: double Dodaj( double dDodane ); void Wypisz(); Pojemnik() { }; Pojemnik( string strNazwa, int nJednostka, double dPojemnosc, double Zajete ); ~Pojemnik() { }; };
class Bipojemnik : public Pojemnik { private: Pojemnik m_cPojA; Pojemnik m_cPojB; public: Bipojemnik() { }; Bipojemnik( Pojemnik cPoj1, Pojemnik cPoj2 ); int Dolej( int ilosc ); void Wypisz(); ~Bipojemnik() { }; };
int main() { Pojemnik cPojA( "wiadro", 10, 1000, 0 ); Pojemnik cPojB( "butelka", 10, 2000, 0 ); Bipojemnik cBipoj( cPojA, cPojB ); cBipoj.Dolej( 4000 ); cBipoj.Wypisz(); return 0; }
Pojemnik::Pojemnik( string strNazwa, int nJednostka, double dPojemnosc, double dZajete ) : m_strNazwa( strNazwa ) , m_nJednostka( nJednostka ) , m_dPojemnosc( dPojemnosc ) , m_dZajete( dZajete ) { }
Bipojemnik::Bipojemnik( Pojemnik cPoj1, Pojemnik cPoj2 ) : m_cPojA( cPoj1 ) , m_cPojB( cPoj2 ) { m_cPojA.Wypisz(); m_cPojB.Wypisz(); }
double Pojemnik::Dodaj( double dDodane ) { m_dZajete += dDodane; if( m_dZajete > m_dPojemnosc ) { double dRozlane = m_dZajete - m_dPojemnosc; m_dZajete = m_dPojemnosc; throw static_cast < float >( dRozlane ); } }
int Bipojemnik::Dolej( int ilosc ) { try { m_cPojA.Dodaj( ilosc ); } catch( float przelane ) { try { m_cPojB.Dodaj( przelane ); } catch( float wylane ) { cout << "Wylalo sie z Bipojemnika: " << wylane << endl << endl; } } }
void Pojemnik::Wypisz() { cout << "Pojemnik o nazwie: " << m_strNazwa << endl; cout << "posiada jednostke: " << m_nJednostka << endl; cout << "ma pojemnosc: " << m_dPojemnosc << endl; cout << "i zawiera: " << m_dZajete << "[j] cieczy " << endl << endl; }
void Bipojemnik::Wypisz() { m_cPojA.Wypisz(); m_cPojB.Wypisz(); }
|
|
Jacob99 |
» 2014-05-13 15:33:30 Do rzucania wyjątków zwykle pisze się oddzielną klasę np. class nadmiar { void what( double ile ) { cout << "W pojemniku jest nadmiar " << ile << " ml cieczy\n"; } };
Poza tym w jakim celu stosujesz rzutowanie statyczne na float? Jest raczej zbędne. A twój kod jest strasznie zagmatwany. I na koniec dobra rada: Definicje funkcji pisz raczej już przed użyciem, zwłaszcza w takim kodzie, gdzie definicję klasy masz na górze, pośrodku funkcję main(), a na dole definicję funkcji z klasy. P.S. Na klasy, nawet małe, zwyczajowo przeznacza się oddzielne pliki .h i .cpp |
|
Carnage2k Temat założony przez niniejszego użytkownika |
» 2014-05-14 17:31:57 Dzięki za pomoc dopiero się uczę klas i każda rada jest dla mnie cenna :) | Poza tym w jakim celu stosujesz rzutowanie statyczne na float? Jest raczej zbędne. |
Niestety taka byla tresc zadania (throw float). | A twój kod jest strasznie zagmatwany. |
Co zrobić żeby był bardziej czytelny? | Definicje funkcji pisz raczej już przed użyciem (...) |
Czyli definiować funkcje (metody) w klasie? |
|
michal11 |
» 2014-05-14 18:07:14 Jak dla mnie ten kod jest dość czytelny, no może poza nazwami zmiennych. Tak jak Jacob99 doradził, lepiej wrzucać klasy do oddzielnych plików. | Definicje funkcji pisz raczej już przed użyciem (...) |
Chyba chodzi o to żeby definicje funkcji składowych pisać od razu po definicji klasy. |
|
Jacob99 |
» 2014-05-14 18:14:22 Chodziło mi o to, że skoro już umieścił klasę razem z funkcją main(), to nie powinien "zagrzebywać" main() w środku kodu, ponieważ można się łatwo pogubić przez to. A jeśli już chcesz tak pisać to przynajmniej oddzielaj każdą definicję linijką komentarza np. class T { };
main() { }
T::Funkcja() { }
A co do tego rzutowania. Nie możesz po prostu zamiast double umieścić float? Czy w treści zadania jest, że trzeba uzyć double? |
|
michal11 |
» 2014-05-14 18:23:01 Ja miałem na myśli coś takiego. class T { };
T::Funkcja() { }
main() { }
|
|
Jacob99 |
» 2014-05-14 18:28:20 Obojętnie czy tak, czy tak żeby tylko było łatwo rozczytać kod i wiedzieć gdzie jest koniec jednego, a gdzie początek drugiego :) |
|
pekfos |
» 2014-05-14 19:21:14 | Co zrobić żeby był bardziej czytelny? |
Nie używać wyjątków. Np przez zagospodarowanie wartości zwracanych. Aktualnie nic z nimi nie robisz, a to poważny błąd. Do rzucania wyjątków zwykle pisze się oddzielną klasę np.
class nadmiar { void what( double ile ) { cout << "W pojemniku jest nadmiar " << ile << " ml cieczy\n"; } };
|
To nie wygląda na poprawne rozwiązanie. |
|
| « 1 » 2 |