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

C++ Απορία (δυναμική διαχείριση μνήμης)


pbp

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

Δημοσ.

Γεια σας,

έχω γράψει τον παρακάτω κώδικα στον οποίο οι ιδιότητες της κλάσης μου είναι στατικές και μέσα στη main() δεσμεύω δυναμικά αντικείμενα...

 

>#include<iostream>
#include<cstring>
using namespace std;

class ergazomenos
{
     private:
             double misthos;
             char epagelma[100];
     public:
            ergazomenos()
            {
                         misthos=0;
                         strcpy(epagelma,"-");
            }
            ergazomenos(double a,char s[])
            {
                         misthos=a;
                         strcpy(epagelma,s);
            }
            void set_misthos(double a){misthos=a;}
            void set_epagelma(char s[]){strcpy(epagelma,s);}
            double get_misthos(){return misthos;}
            char *get_epagelma(){return epagelma;}
};

main()
{
     ergazomenos *Dimitris = new ergazomenos(1800.0,"Pliroforikarios");
     cout<<"Dimitris "<<Dimitris->get_misthos()<<" "<<Dimitris->get_epagelma()<<endl;
     system("PAUSE");
}

 

Τώρα θέλω να κάνω το ίδιο πράγμα με τη διαφορά ότι οι ιδιότητες τις κλάσεις μου θα είναι δείκτες ώστε να δεσμεύεται κάθε φορά το απαιτούμενο μέγεθος μνήμης που χρειάζεται.

Αυτός είναι ο κώδικας...

 

>#include<iostream>
using namespace std;

class ergazomenos
{
                double *misthos;
                char *epagelma;
     public:
            ergazomenos();
            ~ergazomenos();
            ergazomenos(double a, char s[]);
            void set_misthos(double a);
            void set_epagelma(char s[]);
            double get_misthos();
            char *get_epagelma();
};

ergazomenos::ergazomenos()
{
                         misthos = new double;
                         *misthos=0.0;
                         epagelma = new char;
                         *epagelma='\0';
}
ergazomenos::~ergazomenos()
{
                          free(misthos);
                          free(epagelma);
}
ergazomenos::ergazomenos(double a, char s[])
{
                               misthos= new double;
                               *misthos=a;
                               epagelma = new char[(strlen(s)+1)];
                               strcpy(epagelma,s);
}
void ergazomenos:: set_misthos(double a)
{
                            *misthos=a;
}
void ergazomenos::set_epagelma(char s[])
{
    realloc(epagelma,(sizeof(char)*strlen(s))+1);
    strcpy(epagelma,s);
}
double ergazomenos::get_misthos()
{
       return *misthos;
}
char* ergazomenos::get_epagelma()
{
     return epagelma;
}

main()
{
     ergazomenos Dimitris,Xaris(1800.0,"mixanologos mixanikos");
     {
         double *s;
         s= new double;
         *s=Xaris.get_misthos();
         char *n;
         n=Xaris.get_epagelma();
         cout<<"Xaris "<<*s<<" "<<n<<endl;
         free(s);
         free(n);
     }
     {
         Dimitris.set_misthos(1500.0);
         Dimitris.set_epagelma("pliroforikarios");
         double *s;
         s = new double;
         *s=Dimitris.get_misthos();
         char *n;
         n=Dimitris.get_epagelma();
         cout<<"Dimitris "<<*s<<" "<<n<<endl;
         free(s);
         free(n);
     }
     {
         ergazomenos *Arxontas = new ergazomenos(50000.0,"eisodimatias");
         double *s;
         s = new double;
         *s=Arxontas->get_misthos();
         char *n;
         n=Arxontas->get_epagelma();
         cout<<"Arxontas "<<*s<<" "<<n<<endl;
         free(s);
         free(n);
     }
     system("PAUSE");
}

 

-καταρχάς, μπορείτε να μου πείτε που κάνω λάθος και κρασάρει γιατί δεν μου βγάζει κάποιο compile error και έχουν σπάσει τα νεύρα μου...

-Επιπρόσθετα, θα ήθελα να μου πείτε αν στην πραγματικότητα υφίσταται κάτι τέτοιο στον δεύτερο κώδικα που έγραψα. Αυτό το λέω γιατί γνωρίζω ότι μία κλάση ή δομή χωρίς αντικείμενο ή μεταβλητή αντίστοιχα δεν πιάνουν χώρο στη μνήμη του υπολογιστή...

Σας ευχαριστώ πολύ για το χρόνο σας.

Δημοσ.

Υπάρχουν αρκετά λάθη και ανακρίβειες...

 

Γεια σας,

έχω γράψει τον παρακάτω κώδικα στον οποίο οι ιδιότητες της κλάσης μου είναι στατικές και μέσα στη main() δεσμεύω δυναμικά αντικείμενα...

 

Δεν καταλαβαίνω τι θέλεις να πεις "στατικές", μάλλον εννοείς ότι τα members του class (το ένα που είναι pointer δηλαδή) δεν γίνεται dynamically allocated. Ο όρος όμως είναι παραπλανητικός, γιατί παραπέμπει σε static. Αν είναι αυτό που λέω, καλύτερα να το λες περιγραφικά για να αποφεύγεται η σύγχυση.

 

>#include<iostream>
#include<cstring>
using namespace std;

class ergazomenos
{
     private:
             double misthos;
             char epagelma[100];
     public:
            ergazomenos()
            {
                         misthos=0;
                         strcpy(epagelma,"-");
            }
            ergazomenos(double a,char s[])
            {
                         misthos=a;
                         strcpy(epagelma,s);
            }
            void set_misthos(double a){misthos=a;}
            void set_epagelma(char s[]){strcpy(epagelma,s);}
            double get_misthos(){return misthos;}
            char *get_epagelma(){return epagelma;}
};

main()
{
     ergazomenos *Dimitris = new ergazomenos(1800.0,"Pliroforikarios");
     cout<<"Dimitris "<<Dimitris->get_misthos()<<" "<<Dimitris->get_epagelma()<<endl;
     system("PAUSE");
}

 

Τώρα θέλω να κάνω το ίδιο πράγμα με τη διαφορά ότι οι ιδιότητες τις κλάσεις μου θα είναι δείκτες ώστε να δεσμεύεται κάθε φορά το απαιτούμενο μέγεθος μνήμης που χρειάζεται.

Αυτός είναι ο κώδικας...

 

>#include<iostream>
using namespace std;

class ergazomenos
{
                double *misthos;
                char *epagelma;
     public:
            ergazomenos();
            ~ergazomenos();
            ergazomenos(double a, char s[]);
            void set_misthos(double a);
            void set_epagelma(char s[]);
            double get_misthos();
            char *get_epagelma();
};

ergazomenos::ergazomenos()
{
                         misthos = new double;
                         *misthos=0.0;
                         epagelma = new char;
                         *epagelma='\0';
}

 

Καταρχήν δύο βασικά πράγματα:

 

1. Δεν υπάρχει κανένας απολύτως λόγος να χρησιμοποιείς double* αντί για double στο μισθό. Τζάμπα παιδεύεσαι. Επίσης θα πρέπει να κάτσεις να ξανασκεφτείς τι ακριβώς προσπαθείς να κάνεις γιατί αυτό το double* προσωπικά μου δίνει να καταλάβω ότι κάποιος το έγραψε χωρίς να ξέρει ακριβώς γιατί -- και ο προγραμματισμός μ' αυτό τον τρόπο συνήθως δεν έχει καλή κατάληξη.

 

2. Γιατί δεν χρησιμοποιείς std::string για το επάγγελμα (το οποίο διαχειρίζεται το memory allocation μόνο του); Θα ήταν πολύ πιο βολικό και ασφαλές από αυτό που κάνεις με τον char*.

 

>
ergazomenos::~ergazomenos()
{
                          free(misthos);
                          free(epagelma);
}

 

Εδώ αρχίζει ο χορός των προβλημάτων:

 

1. Δεν μπορείς να κάνεις allocate με new και deallocate με free(). Είτε new/delete είτε malloc/free. Αν αυτό δεν διορθωθεί δεν παίζει να παίξει σωστά το πρόγραμμα.

 

2. Κάνεις allocate τις τιμές του epagelma μία φορά σαν new char και μια φορά σαν new char[]. Αυτό σημαίνει ότι πρέπει αντίστοιχα να τα κάνεις αργότερα delete epagelma; και delete[] epagelma; αντίστοιχα. Επομένως χρειάζεται είτε να βάλεις κάποιο σχετικό flag για να ξέρεις ποιά μορφή του delete[] να καλέσεις (προφανής αλλά κακή λύση) είτε να κάνεις πάντα allocate με new char[] (να αλλάξεις δηλαδή αυτό που γίνεται στον default constructor) (όχι η καλύτερη λύση αλλά δε θα σε λιντσάρει κανείς).

 

Ακόμα καλύτερα θα ήταν απλά να το γυρίσεις σε std::string όπως λέω παραπάνω.

 

>
ergazomenos::ergazomenos(double a, char s[])
{
                               misthos= new double;
                               *misthos=a;
                               epagelma = new char[(strlen(s)+1)];
                               strcpy(epagelma,s);
}

void ergazomenos:: set_misthos(double a)
{
                            *misthos=a;
}
void ergazomenos::set_epagelma(char s[])
{
    realloc(epagelma,(sizeof(char)*strlen(s))+1);
    strcpy(epagelma,s);
}

 

Και πάλι, δεν μπορείς να κάνεις realloc κάτι που έγινε allocated με new. Είτε new/delete(ή delete[]) είτε realloc (που βασικά μπορεί να κάνει και τη δουλεία του malloc και του free, 3 σε 1).

 

>
double ergazomenos::get_misthos()
{
       return *misthos;
}
char* ergazomenos::get_epagelma()
{
     return epagelma;
}

main()
{
     ergazomenos Dimitris,Xaris(1800.0,"mixanologos mixanikos");
     {
         double *s;
         s= new double;
         *s=Xaris.get_misthos();
         char *n;
         n=Xaris.get_epagelma();
         cout<<"Xaris "<<*s<<" "<<n<<endl;
         free(s);
         free(n);
     }
     {
         Dimitris.set_misthos(1500.0);
         Dimitris.set_epagelma("pliroforikarios");
         double *s;
         s = new double;
         *s=Dimitris.get_misthos();
         char *n;
         n=Dimitris.get_epagelma();
         cout<<"Dimitris "<<*s<<" "<<n<<endl;
         free(s);
         free(n);
     }
     {
         ergazomenos *Arxontas = new ergazomenos(50000.0,"eisodimatias");
         double *s;
         s = new double;
         *s=Arxontas->get_misthos();
         char *n;
         n=Arxontas->get_epagelma();
         cout<<"Arxontas "<<*s<<" "<<n<<endl;
         free(s);
         free(n);
     }
     system("PAUSE");
}

 

Και τέλος, εδώ κάνεις για άλλη μια φορά free τους pointers που παίρνεις μέσα από το ergazomenos object. Την επόμενη φορά που κάνεις get_misthos() ή get_epagelma() ή όταν το object καταστραφεί θα σκάσουν πυροτεχνήματα γιατί θα προσπαθήσει να αγγίζει freed memory (άσχετα που όπως είπαμε παραπάνω το free είναι λάθος και δε θα φτάσεις καν μέχρι εκεί). Νομίζω ότι χρειάζεσαι διάβασμα περι pointers γιατί γενικά ο όλος τρόπος που χειρίζεσαι το θέμα δείχνει πως δεν κατέχεις το αντικείμενο.

 

Επιπλέον, δεν κάνεις delete τα ergazomenos objects σου, το πρόγραμμα πρόγραμμα ακόμα κι αν τελικά δουλέψει θα έχει memory leaks.

 

-Επιπρόσθετα, θα ήθελα να μου πείτε αν στην πραγματικότητα υφίσταται κάτι τέτοιο στον δεύτερο κώδικα που έγραψα. Αυτό το λέω γιατί γνωρίζω ότι μία κλάση ή δομή χωρίς αντικείμενο ή μεταβλητή αντίστοιχα δεν πιάνουν χώρο στη μνήμη του υπολογιστή...

Σας ευχαριστώ πολύ για το χρόνο σας.

 

Δεν καταλαβαίνω ακριβώς την ερώτηση.

Δημοσ.

Υπάρχουν αρκετά λάθη και ανακρίβειες...

 

 

 

Δεν καταλαβαίνω τι θέλεις να πεις "στατικές", μάλλον εννοείς ότι τα members του class (το ένα που είναι pointer δηλαδή) δεν γίνεται dynamically allocated. Ο όρος όμως είναι παραπλανητικός, γιατί παραπέμπει σε static. Αν είναι αυτό που λέω, καλύτερα να το λες περιγραφικά για να αποφεύγεται η σύγχυση.

 

Όταν λέω "στατικές" εννοώ ότι άμα δηλώσω πχ τη συμβολοσειρά ( s[100] ) αυτή θα πιάνει στανταρ 100 bytes στη μνήμη εξ αρχής και το μέγεθός της δεν θα μεταβάλλεται, ενώ δυναμικά δημιουργώ έναν δείκτη που θα δείχνει στην πρώτη θέση μνήμης της συμβολοσειράς και ανάλογα με το χώρο που χρειάζομαι δεσμεύω και αποδεσμεύω μνήμη.

Με τη δυναμική δέσμευση, δημιουργώντας ένα αντικείμενο της κλάσης "εργαζόμενος" πχ με τον constructor: ergazomenos() το αντικείμενό μου θα πιάνει στη μνήμη 8(από το double)+4 bytes, ενώ με τον πρώτο τρόπο θα πιάνει 108 bytes. (έστω ότι το double δεν είναι δείκτης)

 

 

Καταρχήν δύο βασικά πράγματα:

 

1. Δεν υπάρχει κανένας απολύτως λόγος να χρησιμοποιείς double* αντί για double στο μισθό. Τζάμπα παιδεύεσαι. Επίσης θα πρέπει να κάτσεις να ξανασκεφτείς τι ακριβώς προσπαθείς να κάνεις γιατί αυτό το double* προσωπικά μου δίνει να καταλάβω ότι κάποιος το έγραψε χωρίς να ξέρει ακριβώς γιατί -- και ο προγραμματισμός μ' αυτό τον τρόπο συνήθως δεν έχει καλή κατάληξη.

 

Προφανώς και δουλεύω με το double* καθαρά και μόνο για λόγους εξάσκησης.

 

2. Γιατί δεν χρησιμοποιείς std::string για το επάγγελμα (το οποίο διαχειρίζεται το memory allocation μόνο του); Θα ήταν πολύ πιο βολικό και ασφαλές από αυτό που κάνεις με τον char*.

 

Συγνώμη που δεν το κάνω έτσι, αλλά δεν έχω διδαχτεί ακόμη αυτή τη μέθοδο με την συμβολοσειρές που μου περιγράφεις.

 

 

Εδώ αρχίζει ο χορός των προβλημάτων:

 

1. Δεν μπορείς να κάνεις allocate με new και deallocate με free(). Είτε new/delete είτε malloc/free. Αν αυτό δεν διορθωθεί δεν παίζει να παίξει σωστά το πρόγραμμα.

 

Αυτό με το new/free δεν μας το έχει διευκρινίσει ο καθηγητής αλλά υποθέτω πως έχεις δίκαιο. (Το διόρθωσα στον κώδικά μου αλλά πάλι κρασάρει χωρίς κάποιο compile error).

 

2. Κάνεις allocate τις τιμές του epagelma μία φορά σαν new char και μια φορά σαν new char[]. Αυτό σημαίνει ότι πρέπει αντίστοιχα να τα κάνεις αργότερα delete epagelma; και delete[] epagelma; αντίστοιχα. Επομένως χρειάζεται είτε να βάλεις κάποιο σχετικό flag για να ξέρεις ποιά μορφή του delete[] να καλέσεις (προφανής αλλά κακή λύση) είτε να κάνεις πάντα allocate με new char[] (να αλλάξεις δηλαδή αυτό που γίνεται στον default constructor) (όχι η καλύτερη λύση αλλά δε θα σε λιντσάρει κανείς).

 

Σ αυτό έχεις απόλυτο δίκαιο... Θα προσπαθήσω να το διορθώσω.

 

Ακόμα καλύτερα θα ήταν απλά να το γυρίσεις σε std::string όπως λέω παραπάνω.

 

Ξαναλέω δεν έχω μάθει ακόμα να δουλεύω συμβολοσειρές με διαφορετικό τροπο απο αυτον που το έφτιαξα.

Προφανώς, ο τρόπος που μου προτείνεις μιάζει με τον τρόπο που μεταχειρίζεται η java τις συμβολοσειρές.

 

 

Και πάλι, δεν μπορείς να κάνεις realloc κάτι που έγινε allocated με new. Είτε new/delete(ή delete[]) είτε realloc (που βασικά μπορεί να κάνει και τη δουλεία του malloc και του free, 3 σε 1).

 

Μηπως υπάρχει καμιά αντίστοιχη συνάρτηση της realloc για C++ που να μπορεί να δουλέψει με την new/delete ταυτόχρονα?

 

 

Και τέλος, εδώ κάνεις για άλλη μια φορά free τους pointers που παίρνεις μέσα από το ergazomenos object. Την επόμενη φορά που κάνεις get_misthos() ή get_epagelma() ή όταν το object καταστραφεί θα σκάσουν πυροτεχνήματα γιατί θα προσπαθήσει να αγγίζει freed memory (άσχετα που όπως είπαμε παραπάνω το free είναι λάθος και δε θα φτάσεις καν μέχρι εκεί). Νομίζω ότι χρειάζεσαι διάβασμα περι pointers γιατί γενικά ο όλος τρόπος που χειρίζεσαι το θέμα δείχνει πως δεν κατέχεις το αντικείμενο.

 

Πιστεύω, πως γνωρίζω καλούτσικα από pointers. Όπως ανέφερα πριν αυτό με το double το έκανα μονο και μονο για λόγους εξάσκησης.

Τι εννοείς λοιπόν οτι δεν χειρίζομαι καλα το αντικείμενο? Ότι μας μαθαίνουν κάνω :/

Θα με ενδιέφερε να παραθέσεις τον δικό σου κώδικα εδώ να δω πως θα το δούλευες εσύ αν έχεις χρόνο .

 

Επιπλέον, δεν κάνεις delete τα ergazomenos objects σου, το πρόγραμμα πρόγραμμα ακόμα κι αν τελικά δουλέψει θα έχει memory leaks.

 

Δεν καταλαβαίνω ακριβώς την ερώτηση.

απάντησέ μου πρώτα στα παραπάνω παρακαλώ και θα προσπαθήσω να τη διατυπώσω καλύτερα με βάση αυτά που θα μου πεις.

 

 

 

ευχαριστω και παλι για το χρονο σου.

Δημοσ.

Δες λίγο τον κώδικα όπως είναι (και τρέχει) εδώ, και αν έχεις κάποια απορία εδώ είμαστε.

 

Μερικά σχόλια στο προηγούμενο post σου:

 

Οι operators new/delete και οι συναρτήσεις malloc/realloc/free διαχειρίζονται μνήμη η οποία στη γενική περίπτωση (και άρα όταν προγραμματίζεις πρέπει να θεωρείται δεδομένο) είναι διαφορετική, και ο τρόπος διαχείρισης είναι επίσης διαφορετικός. Στην πράξη, υπάρχει σημαντική πιθανότητα η υλοποίηση των new/delete να γίνεται με χρήση της realloc, αλλά αυτό δεν το εγγυάται κανείς και επομένως είναι δώρο άδωρο. Αν αυτά τα πράγματα όντως δεν τα έχει αναφέρει ο καθηγητής, είναι εγκληματίας.

 

Όσο για τους pointers, αν συνεχίσεις να ασχολείσαι με τη C++ σε μερικά χρόνια θα καταλάβεις ότι αυτή τη στιγμή δεν ξέρεις όσα νομίζεις ότι ξέρεις. Δεν το λέω για κακό, είναι κάτι που ισχύει για όλους στην αρχή.

Δημοσ.

Με τι IDE το τρέχεις; Εμένα μου έτρεξε κανονικά (!!!).

 

Όμως, όντως ακολουθείς κακές τεχνικές. Με το char*, το καταλαβαίνω. Ιδιαίτερα εάν όντως είναι για ονόματα. Το double* όμως όχι. Επίσης, το free, όταν δεν είναι για πίνακες αλλά για απλές μεταβλητές (π.χ. double), λογικά, θα έχει το ίδιο αποτέλεσμα με το delete.

 

 

Επίσης, μία κλάση είναι απλά ένα κομμάτι κώδικα. Ο κώδικας αυτός "μπαίνει" στην μνήμη ΑΦΟΥ δημιουργηθεί κάποιο στιγμιότυπο. Δηλαδή, αφού κάνεις "new". Στην C++, εάν δημιουργήσεις στιγμιότυπο, χωρίς να αρχικοποιείς τις τιμές των members, τότε αυτές παίρνουν τυχαίες τιμές (στην Java όχι).

 

Για να δεις τι γίνεται, κάνε debug και τσέκαρε τις μεταβλητές σου τι τιμές έχουν, τόσο αυτές που δεν είναι δείκτες όσο και τους δείκτες που δείχνουν. Πάντως, σε XCode έτρεξε.

 

 

 

Υ.Γ. Εάν θες να ξανα-απαντήσει κανείς σε αυτό το θέμα, ΑΥΞΗΣΕ ΤΟΝ ΜΙΣΘΟ ΤΟΥ ΠΛΗΡΟΦΟΡΙΚΑΡΙΟΥ!!!!!!!!!!! :P :P :D :D

Δημοσ.

Δες λίγο τον κώδικα όπως είναι (και τρέχει) εδώ, και αν έχεις κάποια απορία εδώ είμαστε.

 

Μερικά σχόλια στο προηγούμενο post σου:

 

Οι operators new/delete και οι συναρτήσεις malloc/realloc/free διαχειρίζονται μνήμη η οποία στη γενική περίπτωση (και άρα όταν προγραμματίζεις πρέπει να θεωρείται δεδομένο) είναι διαφορετική, και ο τρόπος διαχείρισης είναι επίσης διαφορετικός. Στην πράξη, υπάρχει σημαντική πιθανότητα η υλοποίηση των new/delete να γίνεται με χρήση της realloc, αλλά αυτό δεν το εγγυάται κανείς και επομένως είναι δώρο άδωρο. Αν αυτά τα πράγματα όντως δεν τα έχει αναφέρει ο καθηγητής, είναι εγκληματίας.

 

Όσο για τους pointers, αν συνεχίσεις να ασχολείσαι με τη C++ σε μερικά χρόνια θα καταλάβεις ότι αυτή τη στιγμή δεν ξέρεις όσα νομίζεις ότι ξέρεις. Δεν το λέω για κακό, είναι κάτι που ισχύει για όλους στην αρχή.

 

Φίλε, σ ευχαριστώ πολύ για τον κώδικά σου :) Mου είναι απόλυτα κατανοητός.

Σε ευχαριστώ πολύ επίσης για την "σκληρή" κριτική σου! Με βοηθάει να γίνομαι καλύτερος :)

 

Προφανώς το const χρησημοποιείται κυρίως για λόγους ασφάλειας αν κατάλαβα καλα.

Το μονο που δεν κατάλαβα (συντακτικά) είναι το const Δεξία των προτάσεων στις γραμμές 60 και 65.

Θα μπορούσες να μου το εξηγήσεις?

 

Επιπλέον, μήπως γνωρίζεις κάποιον ιστότοπο ο οποίος θα με βοηθήσει να προχωρίσω "παραπέρα" με τους pointers?

 

ΥΓ: Μου άρεσε παρα πολύ ο τρόπος που εγραψες τους κατασκευαστες/δομητές! (εννοώ αυτό που καλείς τις set & get :) .

 

Με τι IDE το τρέχεις; Εμένα μου έτρεξε κανονικά (!!!).

 

Όμως, όντως ακολουθείς κακές τεχνικές. Με το char*, το καταλαβαίνω. Ιδιαίτερα εάν όντως είναι για ονόματα. Το double* όμως όχι. Επίσης, το free, όταν δεν είναι για πίνακες αλλά για απλές μεταβλητές (π.χ. double), λογικά, θα έχει το ίδιο αποτέλεσμα με το delete.

 

 

Επίσης, μία κλάση είναι απλά ένα κομμάτι κώδικα. Ο κώδικας αυτός "μπαίνει" στην μνήμη ΑΦΟΥ δημιουργηθεί κάποιο στιγμιότυπο. Δηλαδή, αφού κάνεις "new". Στην C++, εάν δημιουργήσεις στιγμιότυπο, χωρίς να αρχικοποιείς τις τιμές των members, τότε αυτές παίρνουν τυχαίες τιμές (στην Java όχι).

 

Για να δεις τι γίνεται, κάνε debug και τσέκαρε τις μεταβλητές σου τι τιμές έχουν, τόσο αυτές που δεν είναι δείκτες όσο και τους δείκτες που δείχνουν. Πάντως, σε XCode έτρεξε.

 

 

 

Υ.Γ. Εάν θες να ξανα-απαντήσει κανείς σε αυτό το θέμα, ΑΥΞΗΣΕ ΤΟΝ ΜΙΣΘΟ ΤΟΥ ΠΛΗΡΟΦΟΡΙΚΑΡΙΟΥ!!!!!!!!!!! :P :P :D :D

 

 

Σε Dev-C++ το έτρεχα.

ΥΓ: ok στον επομενο κωδικά που θα παραθέσω ο πληροφορικάριος θα έχει το μισθό του εισοδηματία :D

Δημοσ.

Φίλε, σ ευχαριστώ πολύ για τον κώδικά σου :) Mου είναι απόλυτα κατανοητός.

Σε ευχαριστώ πολύ επίσης για την "σκληρή" κριτική σου! Με βοηθάει να γίνομαι καλύτερος :)

 

Χαίρομαι να βοηθήσω! Για τη σκληρή κριτική, αυτός ακριβώς είναι ο λόγος που την κάνω (και τη δέχομαι επίσης).

 

Προφανώς το const χρησημοποιείται κυρίως για λόγους ασφάλειας αν κατάλαβα καλα.

Το μονο που δεν κατάλαβα (συντακτικά) είναι το const Δεξία των προτάσεων στις γραμμές 60 και 65.

Θα μπορούσες να μου το εξηγήσεις?

 

Για το const έχω δώσει μια σύντομη απάντηση (στα αγγλικά) εδώ, αν σε καλύπτει αποφεύγω να ξαναγράψω τα ίδια πράγματα. :)

 

Επιπλέον, μήπως γνωρίζεις κάποιον ιστότοπο ο οποίος θα με βοηθήσει να προχωρίσω "παραπέρα" με τους pointers?

 

Μπορείς να δεις αυτό εδώ (στα αγγλικά και πάλι), έχει πάρα μα πάρα πολύ ψωμί.

 

ΥΓ: Μου άρεσε παρα πολύ ο τρόπος που εγραψες τους κατασκευαστες/δομητές! (εννοώ αυτό που καλείς τις set & get :)

 

Εκεί γίνονται δύο πράγματα: 1) χρήση initialization list για να δώσω τιμές στα members του class και 2) επαναχρησιμοποίηση κώδικα καλώντας άλλες functions που ήδη υπάρχουν στην class για άλλους λόγους. Και τα 2 είναι "must do" κατά την άποψή μου σε ένα πρόγραμμα που σέβεται τον εαυτό του. Στην προκειμένη περίπτωση φυσικά δεν έχει κάποιο ιδιαίτερο νόημα, αλλά οι καλές συνήθειες πρέπει να εφαρμόζονται πάντα.

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

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

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