Dvs Δημοσ. 25 Απριλίου 2003 Δημοσ. 25 Απριλίου 2003 > #include <iostream> using namespace std; typedef unsigned short int USHORT; typedef unsigned long int ULONG; typedef short int SSHORT; typedef long int SLONG; #define DEBUG class CPolygon { // ABSTRACT CLASS public: void set_values (int a, int b) { width=a; height=b; } virtual int area (void) =0 ; // PURE VIRTUAL FUNCTION virtual ~CPolygon() { #ifdef DEBUG cout << "\nCPolygon Destructor called!"; #endif }; protected: int width, height; }; class CRectangle: public CPolygon { public: int area (void) { return (width * height); } ~CRectangle() { #ifdef DEBUG cout << "\nCRectangle Destructor called!"; #endif }; }; class CTriangle: public CPolygon { public: int area (void) { return (width * height / 2); } ~CTriangle() { #ifdef DEBUG cout << "\nCTriangle Destructor called!"; #endif }; }; void main(int agrc,char **argv[]) { CRectangle rect; CTriangle trgl; // CPolygon poly; // cant create an object CPolygon* ppoly1 = ▭ CPolygon* ppoly2 = &trgl; ppoly1->set_values (2,2); ppoly2->set_values (2,2); cout << ppoly1->area() << endl; cout << ppoly2->area() << endl; delete ppoly1; // delete ppoly2; cout << "\n\nPress enter to exit..."; cin.ignore (0,10); getchar(); } Sto "delete ppoly1;" o programma apla kolaei! Ti mporei na ftaiei? kamia idea?
Billman Δημοσ. 25 Απριλίου 2003 Δημοσ. 25 Απριλίου 2003 Το μόνο που μπορώ να σκεφτώ είναι το εξής: Το ppoly1 παίρνει την διεύθυνση μνήμης του rect αντικειμένου, το οποίο όμως δεν έχει δεσμεύσει δυναμικά μνήμη. Οπότε το delete για αυτό να κάνει τέτοια πατάτα... Just a thought...
GrMikeD Δημοσ. 25 Απριλίου 2003 Δημοσ. 25 Απριλίου 2003 Isxuei odws auto pou leei o Billman. Pairneis anafores se objects pou den einai dunamika dimiourgimena, diladi den einai sto heap, kai meta pas na ta apodesmeuseis pou proupothetei na einai ston heap, opote ginetai exception. Den exei noima outws i allws na ta kaneis delete. Delete kaneis mono oti ginetai create me new!
Dvs Δημοσ. 25 Απριλίου 2003 Μέλος Δημοσ. 25 Απριλίου 2003 Esto oti diagrafo ta 2 delete. Sto telos tou programmatos den prepei na kaleite automata o destuctor ton antikeimenon? Giati den simvainei auto??
GrMikeD Δημοσ. 25 Απριλίου 2003 Δημοσ. 25 Απριλίου 2003 Pws den kaleitai! alla kaleitai automata apo tin C++ otan teleiwnei to programma kai den to blepeis! Bale ena brakepoint px mesa stin ~CPolygon() kai tha deis oti pigainei mesa sto telos! Alla fusika, einai afou ginei to getchar() kai den blepeis to minima. Ama to trekseis apo dos prompt sigoura tha fanei.
Dvs Δημοσ. 25 Απριλίου 2003 Μέλος Δημοσ. 25 Απριλίου 2003 Einai meta to "press any key to exit..." otan teleionei to exe! Giauto den to evlepa :0 thx
GrMikeD Δημοσ. 25 Απριλίου 2003 Δημοσ. 25 Απριλίου 2003 Akrivws.. H othoni einai genika poli anaksiopisto meso gia tetoia trace messages. Sunithws auta grafodai se ekswteriko arxeio.
GothicCrusader Δημοσ. 25 Απριλίου 2003 Δημοσ. 25 Απριλίου 2003 Μια πολύ απλή λύση είναι τα blocks πάντως <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/tongue.gif" alt="" /> > ... ... void main(int agrc,char **argv[]) { { //s a t... CRectangle rect; CPolygon* ppoly1 = ▭ ppoly1->set_values (2,2); cout << endl << endl << ppoly1->area() << endl; } cout << "\n\nPress enter to exit..."; ... ... } Εγώ πάντως νόμιζα ότι ρωτούσε o dvs αν θα έπρεπε ή όχι να καλούνται ξεχωριστά οι destructors των ppoly1 , ppoly2 εκτός από των rect, trg άσχετα με το εάν είναι pointers... Γιατί πράγματι destructors αυτών δεν καλούνται ενώ είναι μεταβλητές σαν όλες τις άλλες, so there is a glitch <img src="http://www.insomnia.gr/ubbthreads/images/graemlins/wink.gif" alt="" /> που φυσικά οφείλεται στην new.
Dvs Δημοσ. 26 Απριλίου 2003 Μέλος Δημοσ. 26 Απριλίου 2003 Me ta blocks apla kaleis ton destructor ekei pou theleis omorfa kai "kathara" (diladi, xoris na xanakaleitai apo tin c++ molis kleisei to programma)
GothicCrusader Δημοσ. 26 Απριλίου 2003 Δημοσ. 26 Απριλίου 2003 Ναι.. δεν το πρότεινα σαν λύση σε κάποιο πρόβλημα. Απλά σαν ιδέα αν θες να βλέπεις πότε τρέχουν σωστά και ποιοί constructors/destructors ειδικά όταν μπλέκεις σε πολύπλοκες classes.. Π.χ. στο παραπάνω πρόγραμμα αν γράψεις: > void main(int agrc,char **argv[]) { { CRectangle rect; CPolygon* ppoly1 = new CRectangle ; ppoly1->set_values (2,2); cout << ppoly1->area() << endl; //delete ppoly1; <- και δεν γράψεις αυτό εδώ } cout << "\n\nPress enter to exit..."; ... } Στο τέλος του μπλοκ θα έπρεπε να έχεις 4 constructors και 4 destructors. Όμως στην πράξη έχεις 4 constructors και 2 destructors ενώ ο δείκτης έχει καταστραφεί! Για αυτό και απαιτείται το delete κανονικά τουλάχιστο μέχρι το τέλος του block και για αυτό αρνείται να δουλέψει το πρόγραμμα στην περίπτωσή σου πιο πάνω.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.