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