Αρχικοποίηση δεικτών πάνω σε αντικείμενα κάποιας κλάσεις (C++).

Tsipouro

Διάσημο μέλος

Ο Tsipouro αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Κτηνίατρος και μας γράφει απο Σουηδία (Ευρώπη). Έχει γράψει 3,037 μηνύματα.
Λοιπόν, έστω ότι έχω μια κλάση, η οποία έχει δηλωμένα σαν private τα χαρακτηριστικά ενός αντικειμένου και σαν public έναν απλό constructor, έναν constructor για πέρασμα παραμέτρων και έναν constructor που αντιγράφει (deep copy) τα πεδία του αντικειμένου object σε ένα άλλο αντικείμενο της ίδιας κλάσης, όπως και κάποιες άλλες συναρτήσεις που δε μας (σας) ενδιαφέρουν. Θέλω να αρχικοποιήσω τα πεδία ενός δείκτη πάνω σε ένα αντικείμενο της κλάσης αυτής μέσω των ήδη υπάρχοντων constructors. Επειδή έχω καιρό να ασχοληθώ με C++ και τώρα μου χρειάζεται για ένα project και επειδή ο καταπληκτικός καθηγητής που μας μάθαινε C++ πέρυσι δεν είχε αναφέρει κάτι τέτοιο στο μάθημα, για να αναγκάστω τώρα εγώ να βγάλω μόνος μου το φίδι απ' την τρύπα, όποιος μπορεί ας μου δώσει ένα παράδειγμα πάνω σε αυτό που με προβληματίζει.

Ένα παράδειγμα κλάσης συμπληρωμένης με constructors και destructor:

Code:
class Antrwpos {
private:
    char *xeria;
    char *podia;
    char *mallia;
public:
    Anthrwpos();  //default
    Anthrwpos(char *xeria, char *podia, char *mallia);  //param
    Antrwpos(const Anthrwpos &a);  //copy
   ~Antrwpos(); //destructor
   void dummy() {
        cout << "O Tsipouros einai axrhstos kai den kserei C++" << endl;
   }
};

//An thelete na grapsw kai ta swmata twn constructors grapste to sta replies...
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
Αν κατάλαβα καλά, αυτό που θέλεις είναι το αντίστοιχο του this της java που στην C++ νομίζω ότι θα το χρησιμοποιήσεις στον constructor με τις παραμέτρους ως:
this->xeria = ...;
this->mallia = ...;
this->podia = ...;
Αυτό ζητάς; :worry:
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Tsipouro

Διάσημο μέλος

Ο Tsipouro αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Κτηνίατρος και μας γράφει απο Σουηδία (Ευρώπη). Έχει γράψει 3,037 μηνύματα.
Αυτό που (πίστευω ότι) χρειάζεται στο κομμάτι του project που γράφω είναι ένας δείκτης σε αντικείμενο της κλάσης π.χ. Antrwpos *a1.

Αν αυτό δεν ήταν δείκτης αλλά μεταβλητή, τότε θα μπορούσα να αρχικοποιήσω ως:
Antrwpos a1 //κλήση default constructor

και στη συνέχεια να περάσω τιμές στα πεδία του με τον parametrized constructor:

Antrwpos a1("κάτι", "κάτι", κάτι");

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

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

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
Ομολογώ ότι με μπέρδεψες. :)
Αν και έχω καιρό να ασχοληθώ με pointers (ζήτω η java :P) αυτό που λες ΔΕΝ νομίζω να γίνεται.

Κάπου στη main του προγράμματος σου, δημιουργείς ένα αντικείμενο Anthrwpos το οποίο έχει private τις συγκεκριμένες string μεταβλητές (xeria, mallia, podia). Με τον απλό constructor ΔΕΝ μπορείς να τις αρχικοποιήσεις αυτές, παρά μόνο με τον constructor με τις παραμέτρους. Μιας και είναι private οι μεταβλητές, ούτε στο main πρόγραμμα μπορεις να τις πειράξεις αφού δεν τις βλέπει. Οπότε ο μόνος τρόπος να τις αρχικοποιήσεις είναι μέσω του constructor με τις παραμέτρους όπου μέσα σε αυτόν θα κάνεις this->και το στοιχείο που θέλεις να αρχικοποιήσεις.

Τώρα αν εσύ θέλεις pointers που θα έχουν τις θέσεις των στοιχείων και να τον έχεις στο main πρόγραμμα για να πειράζεις το περιεχόμενο τους, τότε καταργείς το νόημα του private και δεν ξέρω αν στο επιτρέπει και η ίδια η γλώσσα. :)
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Tsipouro

Διάσημο μέλος

Ο Tsipouro αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Κτηνίατρος και μας γράφει απο Σουηδία (Ευρώπη). Έχει γράψει 3,037 μηνύματα.
Κάπου στη main του προγράμματος σου, δημιουργείς ένα αντικείμενο Anthrwpos το οποίο έχει private τις συγκεκριμένες string μεταβλητές (xeria, mallia, podia). Με τον απλό constructor ΔΕΝ μπορείς να τις αρχικοποιήσεις αυτές, παρά μόνο με τον constructor με τις παραμέτρους. Μιας και είναι private οι μεταβλητές, ούτε στο main πρόγραμμα μπορεις να τις πειράξεις αφού δεν τις βλέπει. Οπότε ο μόνος τρόπος να τις αρχικοποιήσεις είναι μέσω του constructor με τις παραμέτρους όπου μέσα σε αυτόν θα κάνεις this->και το στοιχείο που θέλεις να αρχικοποιήσεις.
Σύνταξη του default constructor:

Anthrwpos::Anthrwpos()
{
xeria=NULL;
podia=NULL;
mallia=NULL;
}
ε, αυτό είναι η αρχικοποίηση.
Ο parametrized constructor περνά ορίσματα στα πεδία της κλάσης.

Anthrwpos::Anthrwpos(char *hands, char *feet, char *hair)
{
xeria = new char [strlen(hands) +1];
podia = new char [strlen(feet) + 1];
mallia = new char [strlen(hair) + 1];
strcpy(xeria, hands);
//τα υπόλοιπα strcpy
}

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

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
Συγχώραμε που δεν καταλαβαίνω, αλλά:
"Θέλω να αρχικοποιήσω τα πεδία ενός δείκτη πάνω σε ένα αντικείμενο της κλάσης αυτής μέσω των ήδη υπάρχοντων constructors."
Τα πεδία του αντικειμένου εννοείς έτσι; Αν ναι, τουλάχιστον στην java, όταν χρησιμοποιείς έναν constructor δημιουργείς ένα νέο αντικείμενο γιαυτό και μπορείς να τον καλέσεις μόνο με "new name_of_constructor();". Το να δημιουργήσεις ένα αντικείμενο με τον απλό constructor και έπειτα να καλέσεις τον constructor με τις παραμέτρους για να πειράξεις τα στοιχεία του αντικειμένου, ουσιαστικά φτιάχνει ένα νέο αντικείμενο με αυτήν την αρχικοποίηση. Εκτός αν στην C++ ισχύει κάτι άλλο. Άρα ο param constructor ΔΕΝ περνάει τα ορίσματα στο αντικείμενο, αλλά φτιάχνει ένα νέο. Λέω κάτι λάθος; :worry:

Αν μπορείς και αν δεν σε κουράζω, εξήγησε μου τι ακριβώς ζητάς να κάνεις, γιατί αυτό το "να αρχικοποιήσω τα πεδία ενός δείκτη πάνω σε ένα αντικείμενο" δε μου κάθεται καλά :worry:
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Tsipouro

Διάσημο μέλος

Ο Tsipouro αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Κτηνίατρος και μας γράφει απο Σουηδία (Ευρώπη). Έχει γράψει 3,037 μηνύματα.
Μισό να δοκιμάσω κάτι και σε ένα τέταρτο το πολύ θα σου πω. Αλλά ίσως οι ήδη υπάρχοντες constructors να δουλεύουν και για αρχικοποίηση δείκτη και όχι μόνο για μεταβλητές.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Tsipouro

Διάσημο μέλος

Ο Tsipouro αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Κτηνίατρος και μας γράφει απο Σουηδία (Ευρώπη). Έχει γράψει 3,037 μηνύματα.
"να αρχικοποιήσω τα πεδία ενός δείκτη πάνω σε ένα αντικείμενο" δε μου κάθεται καλά :worry:
Αυτό θέλει οπωσδήποτε, δε μπορώ να γίνω πιο συγκεκριμένος γιατί ούτε χρόνο έχω, ούτε ηρεμία, τα νεύρα μου είναι στο full και όταν αρχικοποιώ τον δείκτη το πιάνει σαν overload και βγάζει λάθος.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
Ok, ηρέμησε όμως γιατί αλλιώς δεν θα βρεις τη λύση :P
Κοιτούσα τώρα λίγο C++ και απ' ότι είδα όταν κάνεις νέο αντικείμενο σου επιστρέφει δείκτη προς αυτό. Ο δείκτης όμως δεν έχει πεδία, το αντικείμενο έχει του οποίου τον δείκτη έχεις. :worry:
Θα με ενδιέφερε να ρίξω μια ματιά πάντως στα επίμαχα σημεία του κώδικα σου, μπας και έχω καταλάβει τελείως λάθος. Όοοοοοταν φυσικά έχεις χρόνο και ηρεμία :)
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Tsipouro

Διάσημο μέλος

Ο Tsipouro αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Κτηνίατρος και μας γράφει απο Σουηδία (Ευρώπη). Έχει γράψει 3,037 μηνύματα.
Θα αντιγράψω το μέρος του κώδικα που με ενδιαφέρει και θα σου στείλω στο mail σου αμα είναι. Ή σήμερα το απόγευμα ή αύριο.

Ή μάλλον θα το κάνω attach σε κάποιο post σε αυτό το θέμα.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Tsipouro

Διάσημο μέλος

Ο Tsipouro αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Κτηνίατρος και μας γράφει απο Σουηδία (Ευρώπη). Έχει γράψει 3,037 μηνύματα.
Βρήκα πως γίνεται τελικά. Κάντε Lock το topic αν θέλετε. Fandago σε ευχαριστώ φίλε που προσφέρθηκες να βοηθήσεις.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

fandago

Διακεκριμένο μέλος

Ο Ә□⌂щяңš αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 40 ετών και μας γράφει απο Αθήνα (Αττική). Έχει γράψει 6,876 μηνύματα.
Τώρα λοιπόν που ηρέμησες, για εξήγησε μας τι ακριβώς ήθελες και πως το πέτυχες, να μαθαίνουμε και εμείς :)
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Tsipouro

Διάσημο μέλος

Ο Tsipouro αυτή τη στιγμή δεν είναι συνδεδεμένος. Είναι 35 ετών, επαγγέλεται Κτηνίατρος και μας γράφει απο Σουηδία (Ευρώπη). Έχει γράψει 3,037 μηνύματα.
Τίποτα το ιδιαίτερο, πρώτα απ' όλα αρχικοποιούσα ο λακαμάς τον δείκτη 2 φορές χρησιμοποιώντας πάνω του και τον default και τον parametrized constructor (γι' αυτό έβγαζε το σφάλμα σχετικά με overlaod). Τελικά για την αρχικοποίηση αρκούσε η κλήση του constructor που ήθελα όπως ακριβώς και για την αρχικοποίηση μιας μεταβλητής.
 

Σημείωση: Το μήνυμα αυτό γράφτηκε 15 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.

Χρήστες Βρείτε παρόμοια

  • Τα παρακάτω 0 μέλη και 1 επισκέπτες διαβάζουν μαζί με εσάς αυτό το θέμα:
    Tα παρακάτω 0 μέλη διάβασαν αυτό το θέμα:
  • Φορτώνει...
Top