vynimka C++

Programovacie jazyky, rady, poradňa...
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

vynimka C++

Príspevok od používateľa reDo »

ucim sa o vynimkach a neviem preco mi nefunguje tento kod, mohli by ste sa mi na to pls kuknut? lebo ked to skusam s mnou vytvorenymi a zdedenymi triedami tak mi to funguje ale ked to odvodzujem od std::logic_error nejde to, vynimku to zachyti ale pouzije nespravnu funkciu na vypis, tu v logic_error ale ja chcem aby pouzila moju :roll:

Kód: Vybrať všetko

#include <iostream>
#include <stdexcept>

class A : public std::logic_error
{
    public:
        A() : std::logic_error("") {}
        const char * what() { return "Class A\n"; }
};

class B : public std::logic_error
{
    public:
        B() : std::logic_error("") {}
        const char * what() { return "Class B\n"; }
};

class C : public std::logic_error
{
    public:
        C() : std::logic_error("") {}
        const char * what() { return "Class C\n"; }
};

int main()
{
    int number = 10;

    try
    {
        if(number == 5)
            throw A();
        if(number == 10)
            throw B();
        if(number == 15)
            throw C();
    }

    catch(std::logic_error & le)
    {
        std::cout<<"Catched\n";
        std::cout<<le.what();
    }

    return 0;
}
sorien
Medium Expert
Medium Expert
Príspevky: 88
Registrovaný: 02 jún 2011, 21:55

Re: vynimka C++

Príspevok od používateľa sorien »

Kód: Vybrať všetko

#include <iostream>
#include <stdexcept>

class MyLogicError : public std::logic_error << pouzi ako zakladnu triedu pre chyby 
{
    public:
        MyLogicError() : std::logic_error("") {}
        virtual const char * what() { return "Class A\n"; } << nezabudni na virtual
};

class B : public MyLogicError << odvod od nej 
{
    public:
        B() : MyLogicError() {}
        const char * what() { return "Class B\n"; }
};

int main()
{
    int number = 10;

    try
    {
        if(number == 10)
            throw B();
    }

    catch(MyLogicError &le) << chyt cez zakladnu triedu
    {
        std::cout<<"Catched\n";
        std::cout<<le.what(); 
    }

    return 0;
}
kludne mozes nahradit std::logic_error za std::exception

u teba je problematicky tento blok

Kód: Vybrať všetko

    catch(std::logic_error &le) 
    {
        std::cout<<"Catched\n";
        std::cout<<le.what(); << le je typu std::logic_error a kedze metoda std::logic_error.what() nie je virtualna nezavola sa B.what() ale std::logic_error.what() 
    }
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Re: vynimka C++

Príspevok od používateľa reDo »

ja viem to s tymi virtualnymi ale myslel som ze what je virtualna , ok diky za pomoc a inak by sa to nedalo nez vytvorit si zakladnu triedu a z nej odvodzovat?
sorien
Medium Expert
Medium Expert
Príspevky: 88
Registrovaný: 02 jún 2011, 21:55

Re: vynimka C++

Príspevok od používateľa sorien »

dalo napriklad

Kód: Vybrať všetko

class B : public std::logic_error
{
    public:
        B() : std::logic_error("") {}
        const char * what() const throw() { return "Class B\n"; } << pridaj const throw() {
}
alebo

Kód: Vybrať všetko

    try
    {
        if(number == 5)
            throw A();
        if(number == 10)
            throw B();
        if(number == 15)
            throw C();
    }
    catch(A & le)
    {
        std::cout<<"Catched\n";
        std::cout<<le.what();
    }
    catch(B & le)
    {
        std::cout<<"Catched\n";
        std::cout<<le.what();
    }
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Re: vynimka C++

Príspevok od používateľa reDo »

vysvetlis mi pls to prve s const throw()

//autoeditácia príspevku (09 Aug 2011, 19:30)
ta funkcia je virtualna ibaze mne tam chybalo to const throw()
podla mojho stdexcept

Kód: Vybrať všetko

...
class logic_error : public exception 
  {
    string _M_msg;

  public:
    /** Takes a character string describing the error.  */
    explicit 
    logic_error(const string& __arg);

    virtual 
    ~logic_error() throw();

    /** Returns a C-style character string describing the general cause of
     *  the current error (the same string passed to the ctor).  */
    virtual const char* 
    what() const throw();
  };
...
sorien
Medium Expert
Medium Expert
Príspevky: 88
Registrovaný: 02 jún 2011, 21:55

Re: vynimka C++

Príspevok od používateľa sorien »

const znamena, ze je ju mozne volat z const objektu, a to throw() iba hovori kompilatoru, ze ta funkcia nehodi ziadnu vynimku, viac na http://msdn.microsoft.com/en-us/library ... s.80).aspx ... inak to s tou virtualnou metodou beriem s5, moze zato moja lenivost overit si fakty :)
reDo
Star
Star
Používateľov profilový obrázok
Príspevky: 661
Registrovaný: 26 apr 2009, 18:36
Bydlisko: 00100100
Kontaktovať používateľa:

Re: vynimka C++

Príspevok od používateľa reDo »

uz som si to vsetko precital na nete, ale aj tak dik :)
Napísať odpoveď