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

απορια στη c++


Moi!

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

Δημοσ.

Hi!ευχαριστω για τη βοηθεια την προηγουμενη φορα και σορρυ απλα τελειωνε η προθεσμια και ειχα ανχωθει!να ρωτησω κατι αλλο τωρα?οταν μασ λεει οτι μια κλκαση εξειδικευει μια αλλη τι σημαινει ακριβως και πως το υλοποιουμε?με πινακα δεικτων στην αρχικη κλαση ή καμια σχεση?thanks a lot!!

Δημοσ.

ξερεις πως γινεται η κληρονομηση απο τη μαμα κλαση στις υποκλασεις?και πως φτιαχνουμε αντιγραφο?αν ναι δωσε ενα π.χ?

Δημοσ.

ευχαριστω για τη βοηθεια !οταν θελω να φτιαξω ενα αντιγραφο εκτος απο το

copy constractor xriazetai kai o operator;

Δημοσ.

εξαρταται απο την κλαση..... κανονικα ο compiler φτιαχνει default copy constructor και assignment operator ( = ). Ομως αν κανεις initialize καποιον pointer μεσα στον κονστρακτορα σου, θα πρεπει να κανεις override, δηλαδη να ορισεις δικο σου κοπυ κονστρακτορ και οπερεητορ.

 

Πχ, ας υποθεσουμε

>
class MyClass
{
 MyClass();
 ~MyClass();  

 int *a;
}

MyClass()::MyClass()
{
  a = new int[10];
}


MyClass::~MyClass()
{
 delete [] a;
}

 

Στον ctor αρχικοποιουμε τον ποιντερ να δειχνει σε ενα αρραυ 10 ακεραιων (τα λεω λιγο αφελως, αν δε καταλαβαινεις ξαναρωτα)

Στον dtor σβηνουμε αυτο το αρραυ. Αρα οσο υπαρχει ενα instance της MyClass θα εχει αρχικοποιημενο το αρραυ του και οταν παυει να υπαρχει τοτε σβηνει και το αρραυ.

 

Ομως κοιτα τι γινεται εδω:

>

MyClass class1;    // ολα καλα

//χρηση του default copy ctor, αντιγραφονται τα 
//δεδομενα της class1 στην class 2

MyClass class2(class1);    

// σβημουμε την class1, η class2 τωρα τι εχει?

delete class1; <---- οκ    

delete class2; <---- ZONK!!! o pointer a ήδη εχει σβηστει απο τον dtor της class1

 

αυτο γινεται γιατι δεν αντιγραφονται τα ντατα του αρραυ αλλα η τιμη που εχει η μεταβλητη a η οποια δεν ειναι παρα η διευθυνση μνημης στην οποια βρισκονται τα data. Αρα τοσο η class1 οσο και η class2 δειχνουν ΣΤΟ ΙΔΙΟ ΑΡΡΑΥ.

 

Η λυση σε αυτο θα ηταν να ορισεις τον default copy ctor ως

>

// allocate memory to hold 10 integers and copy the data of cp.a to a
MyClass::MyClass( const MyClass& cp)
{
    a = new int[10];
    memcpy(a, cp.a, sizeof(int)*10);
}

 

 

Το ιδιο ισχυει και για τον οπερατορ. Αυτα για να μη τραβας τα μαλλια σου. Γενικα μπορεις να μην ορισεις εσυ copy ctor και = operator, απλα εχε το νου σου.

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

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

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