Абстрактные классы не могут быть созданы, но вы просите компилятор сделать это путем встраивания экземпляра I1
в каждый экземпляр M1
.
Вы можете обойти это, немного изменив свой дизайн и вставив указатель (или умный указатель, если вы можете их использовать) вместо экземпляра I1
:
class M1 : public G1
{
protected:
I1 *sc;
public:
M1(I1 *sc_) {
sc = sc_;
}
void foo() {
int dir = 4;
sc->a(dir);
}
};
РЕДАКТИРОВАТЬ: После прочтения вашего кода, я думаю, что самый простой и чистый способ решения вашей проблемы - передать текущую комнату методу Execute()
вашей команды, например что-то вроде:
class ICommand
{
public:
virtual ~ICommand()
{
}
virtual void Execute(Room *room) = 0;
};
class MoveCommand : public GameCommand
{
public:
MoveCommand()
{
}
void Execute(Room *room)
{
// Do something with `room`...
}
};
void Game::HandleInput()
{
// Read command from user and generate a command object from it.
ICommand *pCommand = ParseCommand(Input::ReadCommand());
if (pCommand) {
pCommand->Execute(GetCurrentRoom()); // Pass current room to command.
delete pCommand;
}
}