C++ state pattern και κλάσεις χωρίς data members
Yiannis Papadopoulos
giannis.papadopoulos at gmail.com
Wed Dec 5 16:14:37 EET 2012
On 12/5/2012 5:24 AM, Theodore Lytras wrote:
> Καλησπέρα σε όλους,
>
> έχω μια απορία σχετικά με το state pattern (ή μάλλον με "αφορμή" το state
> pattern), και πιο συγκεκριμένα στη γλώσσα C++.
>
> Έχω λοιπόν μια κλάση Foo, η οποία κρατά έναν private pointer σε ένα
> αντικείμενο της abstract base class με όνομα State, η οποία έχει έναν αριθμό
> από concrete classes StateA, StateB, etc. Έστω επίσης οτι οι αλλαγές
> καταστάσεων γίνονται από την κλάση Foo. Κάπως έτσι δηλαδή:
>
> class State { // ABSTRACT!!
> }
>
> class StateA : public State {
> }
>
> class StateB : public State {
> }
>
> class Foo {
> public:
> void setState(State* newState);
> private:
> State* m_state;
> }
>
> Έστω οτι οι θυγατρικές κλάσεις της State διαθέτουν ΜΟΝΟ συμπεριφορά (methods)
> και καθόλου data members. Αν έχω λοιπόν 20 αντικείμενα της κλάσης Foo, το
> καθένα κρατάει το δικό του State instance και επομένως πιθανότατα θα υπάρχουν
> αλληλοεπικαλύψεις, δηλαδή instantiations ομοίων αντικειμένων. Επίσης θα έχω
> allocations και deallocations κάθε φορά που αλλάζω state.
>
> Η πρώτη ερώτηση λοιπόν είναι: κερδίζω τίποτα αν επιβάλλω στις θυγατρικές
> κλάσεις της State να έχουν μόνο ένα instance (δηλαδή... singleton pattern?).
> Είναι καλό αυτό? Πως σας φαίνεται?
Δες το flyweight pattern. Κερδίζεις μνήμη και γλυτώνεις τα allocations,
αλλά δεν είναι ιδιαίτερα όμορφο. Μια υλοποίηση έχει το Boost
http://www.boost.org/doc/libs/1_52_0/libs/flyweight/doc/tutorial/index.html
αλλά δεν έχω παίξει μαζί της.
> Και η δεύτερη ερώτηση είναι: αν η setState() ορίσει ένα νέο State "ξεχνώντας"
> να κάνει delete το παλιό, θα έχω memory leak ή όχι? Με άλλα λόγια: όταν κάνει
> κανείς instantiate στο heap μια κλάση χωρίς data members, καταναλώνει μνήμη ή
> όχι??? Γιατί αν δεν καταναλώνει, η απάντηση στην πρώτη ερώτηση είναι προφανής
> (=δεν κερδίζω τίποτα με το singleton).
Ναι, θα έχεις memory leak. Δεν είναι empty class (ακόμα και να ήταν το
sizeof(my_empty_class)==1, οπότε κάνεις leak τουλάχιστον 1 byte) αφού οι
κλάσεις σου State, StateA και StateB έχουν vtable. Κάνε ένα sizeof να
δεις το κάτω όριο.
>
> Ευχαριστώ,
> Θοδωρής
>
>
More information about the Linux-greek-users
mailing list