Προς το περιεχόμενο

Abstract Class + Virtual Destructors


Dvs

Προτεινόμενες αναρτήσεις

Δημοσ.

>
#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 = &rect;
  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?

Δημοσ.

Το μόνο που μπορώ να σκεφτώ είναι το εξής:

Το ppoly1 παίρνει την διεύθυνση μνήμης του rect αντικειμένου, το οποίο όμως δεν έχει δεσμεύσει δυναμικά μνήμη. Οπότε το delete για αυτό να κάνει τέτοια πατάτα...

 

Just a thought...

Δημοσ.

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!

 

Δημοσ.

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.

Δημοσ.

Μια πολύ απλή λύση είναι τα 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 = &rect;
	
	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.

Δημοσ.

Me ta blocks apla kaleis ton destructor ekei pou theleis omorfa kai "kathara" (diladi, xoris na xanakaleitai apo tin c++ molis kleisei to programma)

Δημοσ.

Ναι.. δεν το πρότεινα σαν λύση σε κάποιο πρόβλημα. Απλά σαν ιδέα αν θες να βλέπεις πότε τρέχουν σωστά και ποιοί 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 και για αυτό αρνείται να δουλέψει το πρόγραμμα στην περίπτωσή σου πιο πάνω.

 

 

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...