Consider the following:
#include <iostream>
struct State { virtual ~State() = default; };
struct Drunk : State {
void singWhileDrunk() {std::cout << "Singing while drunk.\n";}
};
struct Person {
State* state;
void singWhileDrunk() {dynamic_cast<Drunk*>(state)->singWhileDrunk();} // Is this good?
};
int main() {
Person bob;
bob.state = new Drunk;
bob.singWhileDrunk();
// dynamic_cast<Drunk*>(bob.state)->singWhileDrunk(); // Using this is better?
}
What I wonder is if Person::singWhileDrunk() should really be defined in Person or not. singWhileDrunk() only has true meaning if the person is drunk, so to define it in Person seems wrong to me. However, it does simplify the code in main(), especially if it is to be used a lot
(dynamic_cast<Drunk*>(bob.state)->singWhileDrunk();
is clearly more typing (and may run into difficulties if I want to redefine it everywhere it is used). Another issue I have is that in my program I have many different types of states, each with their own special functions, and to define them all in Person will really bloat the Person class with many functions that don't even seem to belong in Person. So there seems to be pros and cons to both choices and would like to hear what others have to say about this.