C++ state pattern και κλάσεις χωρίς data members

Theodore Lytras thlytras at gmail.com
Wed Dec 5 13:24:27 EET 2012


Καλησπέρα σε όλους,

έχω μια απορία σχετικά με το 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?). 
Είναι καλό αυτό? Πως σας φαίνεται?

Και η δεύτερη ερώτηση είναι: αν η setState() ορίσει ένα νέο State "ξεχνώντας" 
να κάνει delete το παλιό, θα έχω memory leak ή όχι? Με άλλα λόγια: όταν κάνει 
κανείς instantiate στο heap μια κλάση χωρίς data members, καταναλώνει μνήμη ή 
όχι??? Γιατί αν δεν καταναλώνει, η απάντηση στην πρώτη ερώτηση είναι προφανής 
(=δεν κερδίζω τίποτα με το singleton).

Ευχαριστώ,
Θοδωρής


-- 
"Beauty is transitory."
"Beauty survives."
        --  Mr. Spock & Capt. Kirk, "That Which Survives", stardate unknown
by Theodore Lytras <thlytras at gmail.com>


More information about the Linux-greek-users mailing list