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

[c++] klasa wylapywanych_wyjatkow

Ostatnio zmodyfikowano 2014-05-14 19:23
Autor Wiadomość
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:

C/C++
#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();
}
P-109857
Jacob99
» 2014-05-13 15:33:30
Do rzucania wyjątków zwykle pisze się oddzielną klasę np.
C/C++
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
P-109858
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?
P-109931
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.
P-109936
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.
C/C++
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?
P-109938
michal11
» 2014-05-14 18:23:01
Ja miałem na myśli coś takiego.

C/C++
class T
{
    //...
};

T::Funkcja()
{
    //...
}
//********************************************************

main()
{
    //...
}
//********************************************************
P-109939
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 :)
P-109943
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.
C/C++
class nadmiar
{
    void what( double ile ) { cout << "W pojemniku jest nadmiar " << ile << " ml cieczy\n"; }
};
To nie wygląda na poprawne rozwiązanie.
P-109963
« 1 » 2
  Strona 1 z 2 Następna strona