Mrowqa Temat założony przez niniejszego użytkownika |
Dziwne odpalenie destruktora ... » 2011-04-24 20:17:58 Witam! Zrobiłem sobie klasę i w niej funkcję kopiująca: void config::kopiuj( config wzor ) { clrscr(); cout << " a "; delete[] pytania; cout << " b "; tryb_okno = wzor.pokaz_tryb(); l_pkt = 30; l_pyt = wzor.ile_pyt(); cout << " c "; pytania = new string[ l_pyt ]; cout << " d \n"; for( int i = 0; i < l_pyt; i++ ) { pytania[ i ] = wzor.pokaz_pyt( i ); cout << pytania[ i ] << endl; } cout << "\n e "; getch(); }
Te this i typ zwracany - nieważne. ( tak samo z wydrukami - do znalezienia błędu :D ) Sprawa tkwi w tym, że funkcja odpala destruktor wzoru, nie wiem czemu ... a gdy tam wstawię te 'const' to występuje błąd kompilacji ... O co w tym chodzi ? ;'( PS korzystam z MS VC++ 2010 EDIT: 1>c:\users\artur\desktop\my projects\ktoś komuś\ktoś komuś\config.cpp(305): error C2662: 'config::pokaz_tryb' : cannot convert 'this' pointer from 'const config' to 'config &'
To ten błąd, gdy dodam 'const' ... Ja to odpalam tak: void opcje( config & oryginal ) { config gra; gra.kopiuj( oryginal );
Zależy mi na referencji ... ale coś mi się zdaję, że tak nie wolno ... EDIT: sry za kolejne pytanie: dlaczego przy odpaleniu tego z referencji odpala się destruktor ?? |
|
malan |
» 2011-04-24 20:46:00 wzor nie może być const , bo wywołujesz na jego rzecz metody, które modyfikują (zapewne nie modyfikują, a tylko coś zwracają, ale kompilator tego nie wie) obiekt. Destruktor powiadasz? Użyj debuggera ;) |
|
Mrowqa Temat założony przez niniejszego użytkownika |
» 2011-04-24 20:55:59 Czyli muszę dopisać 'const' w metodzie ;) Debugger ?? - zawsze używam debugowania - lecz nie umiem z tego korzystać ;( tzn podgląd zmiennych itp ... ( pisałem wyżej - mam MS VC++ - będę musiał poczytać o tym przydatnym narzędziu :D ) Dlatego to jest poważne - bo destruktor używał: delete[] pytania; :D To jego jedyna linijka ... Z nadmiernego odpalania --> wywoływał błąd - bo destruktor drugi raz zwalniał ( nieistniejąca już! ) pamięć ... Mam ( nie najlepszy ) pomysł - usunąć destruktor i ręcznie zwalniać pamięć ( lepsze to niż zostawienie jej ... :D ). Wiedz, że nie jestem 'zaawansowany' - takie rozwiązanie mnie satysfakcjonuje ( grunt by działało :D ) - "Dobry programista to taki, który potrafi sobie poradzić" by Mrowqa ;) |
|
malan |
» 2011-04-24 21:04:26 Kompletnie nic nie zrozumiałem z Twojej wypowiedzi ;) Najpierw mówisz o destruktorze klasy config , a teraz o zwalnianiu tablicy std::stringów? "Dobry programista to taki, który potrafi sobie poradzić" |
Z tym się zgodzę... Aczkolwiek wnioskując z Twojej wypowiedzi, to rozumiesz to tak: "Dobry programista to taki, który robi program byle jak, byle tylko działało i jest dumny, że działa". Z tym to już się nie zgodzę ;p Nie ucz się pisać od początku byle jakiego kodu, bo to się zemści na Tobie ;p |
|
Mrowqa Temat założony przez niniejszego użytkownika |
» 2011-04-24 21:09:27 Pisałem odnośnie destruktora - jakim prawem się odpala !!?? :D Głównie właśnie mi chodzi o to, że gdy się odpala - zwalnia pamięć = przy swoim 'końcu' znów to robi = błąd, albo jeszcze wcześniej ... Ja właśnie próbuję się pozbyć tego błędu - żeby działało.
A co mojej złotej myśli - zgadzam się z tobą ... Kto wie co będzie trzeba by zrobić z kodem później ?? Jak się zagmatwa kod ( do tego bez komentarzy - które są naprawdę bardzo przydatne, zwłaszcza w dłuższych projektach ) to potem będzie jeden wielki śmietnik ... jak w rejestrze :)
EDIT: działa !!! Szczęście ( satysfakcja ) z naprawy poważnego błędu ( nawet nie poważnego - grunt, że długo się nad nim siedziało ) jest wielka ! ( nawet jeśli program nie jest skończony ! ). - wiem o tym od dawna i ponad się sprawdza ... |
|
malan |
» 2011-04-24 21:39:48 Bardzo się cieszę, że działa, ale jakbyś jeszcze napisał (mniej-więcej) co zrobiłeś i gdzie był błąd to potomni będą Ci wdzięczni ;) |
|
Mrowqa Temat założony przez niniejszego użytkownika |
» 2011-04-24 21:46:47 Najlepiej to wygląda na kodzie, ale powiem to normalnie ( na kodzie nic Byście nie zrozumieli ).
To nie jest rozwiązanie tego tematu, tylko mojego problemu ;) !!!
Destruktor zostawiłem pusty ( czemu nie ?? mogłem też usunąć ... ). Destruktor tylko zwalniał pamięć zarezerwowaną dla wskaźnika - zrobiłem funkcję składową ( metodę ) która to robi za destruktor - i zwalniałem pamięć 'ręcznie' ;) tzn przed słówkiem return odpalałem funkcję :D Na szczęście w moim programie to tylko kilka miejsc ... ;) PS mogłem zostawić to i nie zwalniać pamięci - ale to jest bardzo złe wyjście ... ;)
Modek jest już 'happy' ?? ^^ |
|
malan |
» 2011-04-24 22:13:59 Ok, czyli problem z const rozwiązany, z destruktorem też, więc zamykamy ;) |
|
« 1 » |