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

John Tsiombikas nuclear at member.fsf.org
Wed Dec 5 17:06:18 EET 2012


On Wed, Dec 05, 2012 at 01:24:27PM +0200, 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.

Exasa ena logiko vima, giati na exeis allocations kai deallocations?
Kane create ta states sou sto initialization kapou, kai apla thete ton
pointer kathe fora.

> Η πρώτη ερώτηση λοιπόν είναι: κερδίζω τίποτα αν επιβάλλω στις θυγατρικές 
> κλάσεις της State να έχουν μόνο ένα instance (δηλαδή... singleton pattern?). 
> Είναι καλό αυτό? Πως σας φαίνεται?

Stamata na skeytese me patterns san koptoraptou, kodika grafeis. To an
tha kaneis ena i perisotera instances einai sto xeri sou, de xreiazetai
na to epivaleis kapos.

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

Katanalonei. Episis oi classes sou den einai adies, exoun ta dedomena
tis base class + otidipote allo prosthesoun + to virtual function table.

-- 
John Tsiombikas
http://nuclear.mutantstargoat.com/


More information about the Linux-greek-users mailing list