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

c++ - απορία πίνακα αντικειμένου


pbp

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

Δημοσ.

γεία σάς,

θα μπορούσε κάποιος πως μπορω να φτιάξω δυναμικά έναν πίνακα αντικειμένου μιας κλάσης?

 

δηλαδή έστω ότι έχουμε μια κλαση με το όνομα worker

 

ας πούμε ότι δηλώνω μια μεταβλητή τύπου worker (αντικείμενο) έτσι:

worker *obj = new worker();

 

τώρα άμα θέλω να δεσμεύσω δυναμικά ένα πίνακα τύπου worker πως θα το κάνω?

ευχαριστω.

Δημοσ.

Το κάνεις με τον ίδιο ακριβώς τρόπο όπως και για τις ενδογενείς μεταβλητές (int, float κλπ).

 

Και στο ξαναλέω για δεύτερη φορά, πάρε ένα βιβλίο για C++.

Έχουν όλα αυτά τα θέματα πολύ καλογραμμένα...

Δημοσ.

έστω ότι θέλω να δεσμεύσω μνήμη για ένα πίνακα ακέραιων 4ων θέσεων...

int* obj = new int[4];

το θέμα είναι ότι άμα θέλω να δεσμεύσω ένα πίνακα τύπου "μιας κλάσης" στη θέση του "int[4]" καλώ τον κατασκευαστή της κλάσης...

που θα δηλώσω πόσες θέσεις θα έχει ο πίνακας?

 

έχω το βιβλίο "C++ σε βάθος" και το έχω μελετήσει όλο πολύ καλά...

Δεν νομίζω ότι αναφέρει κάτι...

Δημοσ.

Για ένα πίνακα ακεραίων, έστω obj, εσύ έγραψες ότι

 

int* obj = new int[4];

 

Eδώ καλείς constructor ;

Όχι. Mετά δίνεις τις τιμές στα στοιχεία του πίνακα obj, ένα-ένα, καλώντας τον consrtuctor τους ή το = .

 

Αντίστοιχα για έναν πίνακα obj της (υποθετικής) κλάσσης myClass είναι :

 

myClass* obj = new myClass[4];

 

Όμοια με πριν, προσπελαύνεις ένα-ένα τα αντικείμενα του πίνακα obj και τους δίνεις τιμές με τον constructor τους ή το = .

Πού είναι η δυσκολία ;

 

-

Δημοσ.

ναι το ξέρω αυτό...

η απορία μου είναι αν μπορω να καλέσω κ κατασκευαστή ταυτόχρονα ;-)

Δημοσ.

Όσον αφορά αυτό που ρωτάς, τα πράγματα είναι πολύ απλά: ο default constructor της class myClass καλείται αυτόματα για κάθε ένα από τα objects του πίνακα. Μπορείς να διαβάσεις περισσότερα εδώ.

 

ΑΛΛΑ:

 

Αν τα objects που θέλεις είναι κάποιας class που συμμετέχει σε class hierarchy (κάνει derive από άλλη class, ή άλλη class κάνει derive από τη δική σου), απέφυγε να δημιουργείς arrays από objects (διαφορετικά θα έρθει κάποια μέρα που θα το μετανοιώσεις). Αντί γι' αυτό, προτίμησε arrays από pointers σε objects ή ακόμα καλύτερα έναν std::vector.

Δημοσ.

Αν τα objects που θέλεις είναι κάποιας class που συμμετέχει σε class hierarchy (κάνει derive από άλλη class, ή άλλη class κάνει derive από τη δική σου), απέφυγε να δημιουργείς arrays από objects (διαφορετικά θα έρθει κάποια μέρα που θα το μετανοιώσεις). Αντί γι' αυτό, προτίμησε arrays από pointers σε objects ή ακόμα καλύτερα έναν std::vector.

 

Ενώ ξεκινάς σωστά, τελειώνεις λάθος: πράγματι, αν έχουμε αντικείμενα που ανήκουν σε ιεραρχία κλάσεων, είναι συνήθως καλύτερο να τα χειριζόμαστε μέσω δεικτών, άρα και να φτιάχνουμε πίνακες από δείκτες σε αυτά. Όμως το αν θα χρησιμοποιήσουμε vector ή απλό πίνακα δεν έχει καμία σχέση με αυτό. Λειτουργικά, ένα vector από αντικείμενα είναι το ίδιο με έναν απλό πίνακα από αντικείμενα. Ομοίως, ένα vector από δείκτες σε αντικείμενα είναι λειτουργικά ίδιο με έναν απλό πίνακα από δείκτες. Επομένως η επιλογή vector ή απλού πίνακα δεν έχει σχέση με το αν θα προσπελάσουμε τα αντικείμενα μέσω απλών μεταβλητών ή μέσω δεικτών.

Δημοσ.

Ενώ ξεκινάς σωστά, τελειώνεις λάθος: πράγματι, αν έχουμε αντικείμενα που ανήκουν σε ιεραρχία κλάσεων, είναι συνήθως καλύτερο να τα χειριζόμαστε μέσω δεικτών, άρα και να φτιάχνουμε πίνακες από δείκτες σε αυτά. Όμως το αν θα χρησιμοποιήσουμε vector ή απλό πίνακα δεν έχει καμία σχέση με αυτό. Λειτουργικά, ένα vector από αντικείμενα είναι το ίδιο με έναν απλό πίνακα από αντικείμενα. Ομοίως, ένα vector από δείκτες σε αντικείμενα είναι λειτουργικά ίδιο με έναν απλό πίνακα από δείκτες. Επομένως η επιλογή vector ή απλού πίνακα δεν έχει σχέση με το αν θα προσπελάσουμε τα αντικείμενα μέσω απλών μεταβλητών ή μέσω δεικτών.

 

Έχεις απόλυτο δίκιο φίλε μου. Δεν εννοούσα αυτό, αλλά έτσι που ξαναδιαβάζω πως το έθεσα σηκώνει σίγουρα βελτίωση. Αυτό που ήθελα να πω είναι array απο pointers, ή std::vector (πάλι όμως από pointers).

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

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

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