For the life of me I cannot understand at all why this program is getting a segmentation error. The issue is that it retrieves an object within the vector container uses a function within the menu class using the get_command() and for some reason after testing the main function line by line this one results in a segmentation fault:
menu->get_command()->execute();
I have tried changing the syntax to create a new command object that stores the returned object from get_command() and changed the index between 0 and -1 and still nothing fixes the error. I have spent at least a couple of hours trying to figure out why but I cannot seem to find a solution.
class Base {
public:
    /* Constructors */
    Base() { };
    /* Pure Virtual Functions */
    virtual double evaluate() = 0;
    virtual std::string stringify() = 0;
};
class op : public Base
{
public:
    op() { };
    op(double op1) { operand = op1; }
    double evaluate() { return operand; }
    string stringify() {
        string value = to_string(operand);
        return value;
    }
private:
    double operand;
};
class Command {
protected:
    Base* root;
public:
    Command() { this->root = nullptr; }
    double execute() { return root->evaluate(); }
    std::string stringify() { return root->stringify(); }
    Base* get_root() { return root; }
};
class Menu {
private:
    int history_index; // Indexes which command was last executed, accounting for undo and redo functions
    std::vector<Command*> history; // Holds all the commands that have been executed until now
public:
    Menu() {
        // Constructor which initializes the internal members
        history_index = -1;
    }
    std::string execute() {
        // Returns the string converted evaluation of the current command
        return to_string(history[history_index - 1]->execute());
    }
    std::string stringify() {
        // Returns the stringified version of the current command
        return history[history_index]->stringify();
    }
    bool initialized() {
        // Returns if the history has an InitialCommand, which is necessary to start the calculation
        if (history[history_index] != nullptr)
            return true;
        else
            return false;
    }
    void add_command(Command* cmd) {
        // Adds a command to the history (does not execute it), this may require removal of some other commands depending on where history_index is
        history.push_back(cmd);
        history_index++;
    }
    Command* get_command() {
        // Returns the command that the history_index is currently referring to
        return history[history_index];
    }
    void undo() {
        // Move back one command (does not execute it) if there is a command to undo
        history_index--;
    }
    void redo() {
        // Moves forward one command (does not execute it) if there is a command to redo
        history_index++;
    }
};
class InitialCommand : public Command {
protected:
    Base* root;
public:
    InitialCommand(Base* b) { this->root = b; }
    double execute() { return root->evaluate(); }
    std::string stringify() { return root->stringify(); }
    Base* get_root() { return root; }
};
void main()
{
    Menu* menu = new Menu();
    InitialCommand* temp = new InitialCommand(new op(7));
    menu->add_command(temp);
    EXPECT_EQ(menu->get_command()->execute(), 7);
    system("PAUSE");
}
 
     
    