Im writing a program that simulates a vacuum cleaning a room. There is an initial state of dirty spots and I want to use various AI algorithms to find the best paths to clean the room. By making the algorithms separate from the actual problem I think my solution will be very modular.
Each algorithm only knows about States. Each state can be expanded to children states. Here is my first algorithm, UniformCost:
#include<iostream>
#include<set>
class State {
public:
    State(){}
    bool operator< (const State& s) const;
    bool isGoal();
    std::set<State> expand();
};
class UniformCost {
private:
    State startState;
    std::set<State> closedList; //list of no repeated states
public:
    State start;
    void setStart(State s);
    State* getSolution();
};
void UniformCost::setStart(State st) {
    start = st;
}
State* UniformCost::getSolution() {
    closedList.insert(start);
    while(!closedList.empty()) {
        State cur = *closedList.begin();
        if(cur.isGoal()) {
            return &cur;
        }
        closedList.erase(cur);
        std::set<State> children = cur.expand();
        for (std::set<State>::iterator i = children.begin(); i != children.end(); ++i) {
            closedList.insert(*i);
        }
    }
}
My main application creates the initial Node that is a child class of State.
class Node : public State {
public:
    std::pair<int,int> loc;
    int g_val;
    std::set<std::pair<int,int> > dirt;
    std::vector<char> path;
    bool isGoal() {
        return dirt.size() == 0;
    }
    bool operator< (const State& s) const {
        Node n = (Node) s;
        if(loc == n.loc) {
            return false;
        }
        if(g_val <= n.g_val) {
            return true;
        }
        return false;
    }
    std::set<State> expand() { 
        std::set<State> ret;
        return ret;
    }
};
How can I override the operator in the Node class that is expecting a "operator< (const State&)"? Or a more general question, how would I handle future "casting" of States?
