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

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

  • Moderators
Δημοσ.

στη διαχείριση της μνήμης με pointers που δείχνουν εκεί που πρέπει, και με τους απαραίτητους destructors για να μην γίνει μπάχαλο η μνήμη κλπ κλπ κλπ

 

Άμα δω owning raw pointer θα έρθω να σε δαγκώσω.

 

 

@OP

Επειδή ξεκίνησα το απόγευμα να το κάνω λίγο, θα σε ενδιέφερε να βάλω τη δική μου λύση; Το δυστυχές είναι ότι δε βλέπω deadline στην εργασία σου για να μπορώ να τη βάλω μετά απ' αυτό, οπότε αν όντως σ' ενδιαφέρει θα πρέπει να βάλεις εσύ κάτι πρώτα για να δείξεις ότι ασχολείσαι.

 

 

1. Το is_attached_tο στο Character είναι πλεονασμός. Η λίστα έχει Person και το Person δείχνει το Character, το οποίο μπορεί να αλλάζει..Η αλλαγή όμως γίνεται με διατήρηση των HitPoints, άρα η αλλαγή γίνεται με την κράτηση του δείκτη προς το Charcter, δημιουργία νέου με το τύπο που θέλουμε και με hitpoints αυτά του "παλιού", αποδέσμευση του παλιού.  Επειδή θέλει το is_attached_tο, σημαίνει ότι πρέπει να αποδεσμευτεί σε αυτο που διαγράφουμε και να δεσμευτεί ξανά στο νέο...το Person...που το δείχνει. Δεν βλέπω όμως κάποια χρησιμότητα αυτού του δείκτη

 

Δεν δημιουργείς/καταστρέφεις/αποδεσμεύεις τίποτα. Η αλλαγές γίνονται σε attribute μέσα στο Person, όχι στο ίδιο το Person.

  • Απαντ. 34
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Δημοφιλείς Ημέρες

Δημοσ.

@Kercyn,

αν θέλουμε σωστό OOP τότε δεν φτιάχνουμε μια κλάση Person με attribute good, bad, zombie. Αλλά μια βασική κλάση character και τρεις κλάσεις πάνω σε αυτήν. Βάζουμε το World να δέχεται Peson, άρα δέχεται και τα subclass αυτου.Όταν θέλουμε να αλλάξουμε.

Δες στην σελίδα 2 στο σχέδιο ότι έχει ξεχωριστό κουτί Person, Character και οι τρεις μορφές του.

  • Moderators
Δημοσ.

Το Person είναι wrapper class που έχει μέσα ένα unique_ptr<Character>. Προφανώς δε βάζεις ένα attribute για το κάθε subclass.

  • Like 1
Δημοσ.

@Kercyn,

αν θέλουμε σωστό OOP τότε δεν φτιάχνουμε μια κλάση Person με attribute good, bad, zombie. Αλλά μια βασική κλάση character και τρεις κλάσεις πάνω σε αυτήν. Βάζουμε το World να δέχεται Peson, άρα δέχεται και τα subclass αυτου.Όταν θέλουμε να αλλάξουμε.

Δες στην σελίδα 2 στο σχέδιο ότι έχει ξεχωριστό κουτί Person, Character και οι τρεις μορφές του.

Έχει νόημα. Ένας κακός καλός και zombie έχει κοινά attributes με ένα Person. Επίσης κάνεις virtual methods για τον person που τις κληρονομεί η κάθε κλάση και μετά τις κάνει να έχουν μοναδικό για την κάθε μία functionality
Δημοσ.

Οκ, και όταν θα πρέπει να αλλάξει ο person το character τότε δεν θα βάλεις νέο αντικείμενο, δηλαδή να βάλεις νέο character άρα να καταστραφεί το πσλιό;

Δημοσ.

Οκ, και όταν θα πρέπει να αλλάξει ο person το character τότε δεν θα βάλεις νέο αντικείμενο, δηλαδή να βάλεις νέο character άρα να καταστραφεί το πσλιό;

θα κάνει constructor που θα δημιουργεί αντικείμενο της desired κλάσης και θα το πετάει με pointer που θα δέχεται. Φαντάζομαι... Θα παλέψω να το λύση αλλά δεν νομίζω να το καταφέρω όλο γιατί ακόμα δεν είναι τοοσ advanced αυτά που ξέρω στη C++. Γιαυτό δεν το διάβασα όλο, δεν ξέρω να κάνω τα πάντα.
Δημοσ.

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

Με είδες να λέω ότι ενοχλείς, ότι είναι υποτιμητικό και ό,τι άλλο ευφάνταστο έγραψες;

 

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

 

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

Δες ένα πρόχειρο παράδειγμα Μ2000. Το Person έχει μέσα έναν pointer σε Character, ο οποίος μπορεί να αλλάξει τύπο όποτε θέλουμε.

 

http://ideone.com/atwEpM

Κοντά είσαι.

 

Λίγο ακόμα και πας στο strategy pattern, το οποίο θα συνιστούσα στο ΟΡ.

 

Δηλαδή, θα έχει (composition) η κλάση person/entity/character ένα μέλος, π.χ. Behavior (pure virtual)

 

Επίσης θα έχει και μία μέθοδο, π.χ. interact. Η μέθοδος αυτή θα καλεί την μέθοδο doInteraction του Behaviour. Αναλόγως το implementation του Behaviour, θα γίνεται και διαφορετικό interaction.

 

Με Java (εκεί όπου οι φίλοι σου δεν έχουν πρόσβαση στα ιδιαίτερα μέρη σου) θα ήταν πιο όμορφο :D

Δημοσ.

Keyrcyn, στο κώδικά σου:

Αυτό εδώ:

AttachedCharacter->AttachedPerson = this;

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

 

Σε αυτό, η 2η γραμμή τι κάνει; Περνάει άλλη αναφορά στην υπάρχουσα αναφορά;

  1. auto Temp = std::make_unique<Good>();
  2. AttachedCharacter.reset(Temp.release());
  • Moderators
Δημοσ.

 

Keyrcyn, στο κώδικά σου:

Αυτό εδώ:

AttachedCharacter->AttachedPerson = this;

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

 

Σε αυτό, η 2η γραμμή τι κάνει; Περνάει άλλη αναφορά στην υπάρχουσα αναφορά;

  1. auto Temp = std::make_unique<Good>();
  2. AttachedCharacter.reset(Temp.release());

 

 

Σκέψου το unique_ptr σαν έναν pointer που κάνει manage ένα object και προσφέρει μεγαλύτερη ασφάλεια κι ευκολία από έναν raw pointer. Το reset διαγράφει το τρέχον managed object και παίρνει ένα καινούριο object να κάνει manage. Το release αφήνει το τρέχον managed object ελεύθερο για να το πάρει όποιος θέλει. Είναι ψιλομπακάλικες εξηγήσεις αυτές αλλά τα λέω πιο πολύ για να καταλάβεις τι γίνεται.

 

Στο πρώτο που λες, πρέπει στο καινούριο αντικείμενο που φτιάχνω να δώσω τις κατάλληλες τιμές για να μπορεί να δουλέψει. Το AttachedPerson στο Character χρειάζεται γιατί μερικές συναρτήσεις του πρέπει να ξέρουν σε ποιο Person είναι κολλημένο το Character.

 

http://en.cppreference.com/w/cpp/memory/unique_ptr/reset

http://en.cppreference.com/w/cpp/memory/unique_ptr/release

 

 

Με Java θα ήταν πιο όμορφο :D

 

Ignored + reported

 

Θα κοιτάξω το strategy btw...

  • Like 1
Δημοσ.

@Keyrcyn,

για το AttachedPerson, θα λες για συναρτήσεις που ακόμα δεν έχουν μπει (στο κώδικα που δείχνεις)

Δημοσ.

Kercyn,

 

Γιατί όχι:

AttachedCharacter.reset(new LOIPON_ZOMBIE);

αντί για:

auto Temp = std::make_unique<LOIPON_ZOMBIE>();
AttachedCharacter.reset(Temp.release());

?

  • Like 1
  • Moderators
Δημοσ.

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

 

Από https://herbsutter.com/gotw/_102/

 


Brief recap: An expression such as new T1 is called, simply enough, a new-expression. Recall what a new-expression really does (ignoring in-place and array forms for simplicity, because they’re not very relevant here):

  • it allocates memory;
  • it constructs a new object in that memory; and
  • if the construction fails because of an exception the allocated memory is freed.

 

 

From the standard, in 12.2/3 (unchanged from C++98):

Temporary objects are destroyed as the last step in evaluating the full-expression that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception.

Δημοσ.

Καλα μικρή και η διαφορά μεταξύ των δύο έτσι και αλλιώς. Το μόνο έξτρα καλούδι της πιο shortened version που μπορώ να σκεφτώ είναι οτι δεν κάνει impose c++ 14 features.

 

Ένας θεος ξέρει γιατί δεν έβαλαν το make_unique νωρίτερα..

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

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