zizou666 Posted December 31, 2010 Report Share Posted December 31, 2010 Mam taki problem kiedy probuje wzbogacic swoje stare programy o obsluge sytuacji wyjatkowych. Otoz mam jakis konstruktor w klasie odpowiedzialnej za date, no i w tym kostruktorze rzucam sobie wyjatki jesli cos mi tam nie pasuje. Potem w mainie mam taki fragment kodu: try { data proba(30, 2, 2000); } catch (int) { data proba(1,1,2000); cout<<proba; } Wyjatek jest rzucany po prostu w postaci liczby int, ale mniejsza o to. Kiedy zawartosc "try" nie jest spelniona wszystko jest ok, wchodzi do "catch" i wykonuje co tam ma wykonac. Kiedy natomiast jest spelniona to tworzy mi obiekt, ktorego nie moge uzywac w reszcie programu. Jesli wtedy za "catch" napisac np "cout<<proba" to wysoczy blad, ze obiekt "proba" nie istnieje. Wydaje sie to w miare logiczne, ale jest jakis sposob zeby to obejsc? Z gory dzieki za pomoc. I jakby co: tak, tak - mam przeladowany operator "<<" w swojej klasie data Link to comment Share on other sites More sharing options...
gus Posted December 31, 2010 Report Share Posted December 31, 2010 Ponieważ deklaracja obiektu proba znajduje się w bloku try-catch, to poza tym blokiem nie jest już widoczna (precyzyjniej rzecz ujmując zasięg obiektu kończy się wraz z klamrą zamykającą blok try-catch. W przypadku gdy wyrzuca wyjątek, program wchodzi do bloku catch, tam deklaruje obiekt proba i wywołuje na nim operację, dlatego działa. Możesz to poprawić używająć wskaźników i dynamicznie tworząc obiekt, czyli coś takiego: data* pProba; try { pProba = new data(30, 2, 2000); } catch (int) { pProba = new data(1,1,2000); cout << &pProba; } //... //... delete pProba; Link to comment Share on other sites More sharing options...
[Ekspert] Mormegil Posted December 31, 2010 Report Share Posted December 31, 2010 No w C++ zmienna jest przypisana do bloku w którym została zdefiniowana. W tym wypadku do bloku try. W C jest inaczej, tam zmienne są związane z funkcją. Co z tym zrobić? Trzeba zmienną zdefiniować przed blokiem try. Nie ma innej opcji. Jeżeli obiekt ma konstruktor i koniecznie musi on zostać wywołany w bloku try, to używa się alokacji dynamicznej (ewentualnie robisz placement new na wcześniej przygotowanym obszarze pamięci - kwestie wydajności alokacji pamięci). I tutaj ujawnia się ogromna wada wyjątków. Są jedyną metodą obsługi błędów konstruktora i jednocześnie utrudniają używanie konstruktora. I pamiętaj, nigdy nie rzucaj wyjątku z destruktora. Nigdy! Link to comment Share on other sites More sharing options...
zizou666 Posted December 31, 2010 Author Report Share Posted December 31, 2010 Kurcze nie wiedzialem ze zmienne i obiekty w bloku try sa traktowane jako lokalne. Dzieki wielkie za pomoc. Wlasnie nigdzie w Pasji nie moglem znalesc czegos w tej kwestii. Temat chyba do zamkniecia Link to comment Share on other sites More sharing options...
Sevard Posted January 1, 2011 Report Share Posted January 1, 2011 Przed zamknięciem proponuję jeszcze przeczytanie tej części Megatutoriala. Tam jest napisane trochę o zasięgu zmiennych w C++. Problem rozwiązany, więc temat zamykam. W razie potrzeby otwarcia tematu, proszę o kontakt przez PW. Link to comment Share on other sites More sharing options...