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

Dziwne odpalenie destruktora ...

Ostatnio zmodyfikowano 2011-04-24 22:13
Autor Wiadomość
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:
C/C++
/*config*/ void config::kopiuj( /* const */ config wzor ) //************** kopiowanie ***************************
{
    clrscr();
    cout << " a ";
    delete[] pytania;
    cout << " b ";
    tryb_okno = wzor.pokaz_tryb();
    l_pkt = /*wzor.ile_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();
    //return *this;
}
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:
C/C++
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 ??
P-31883
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 ;)
P-31888
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 ;)
P-31892
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
P-31893
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 ...
P-31895
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 ;)
P-31899
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' ?? ^^
P-31902
malan
» 2011-04-24 22:13:59
Ok, czyli problem z
const
 rozwiązany, z destruktorem też, więc zamykamy ;)
P-31906
« 1 »
  Strona 1 z 1