Вероятно, кому-то будет действительно легко обнаружить проблему здесь, но я пробиваю это уже более часа и не могу заставить что-то работать.
код:
AIState.h
#ifndef AISTATE_H
#define AISTATE_H
#include "everythingelse.h"
class AIState {
public:
virtual void PieceMoved() = 0;
virtual void Move(Player &player) = 0;
};
#endif
AIState_Generic.h
#ifndef AISTATE_GENERIC_H
#define AISTATE_GENERIC_H
#include "AIState.h"
class AIState_Generic : public AIState {
public:
virtual void Move(Player &player);
};
#endif
Я получаю две ошибки от AIState_Generic.h
:
- ошибка C2504: «AIState»: базовый класс не определен
- ошибка C2061: синтаксическая ошибка: идентификатор «Player»
Я думаю, что включение заголовка, содержимое которого - не что иное, как определение AIState
, остановит эту первую ошибку, верно? Вторая ошибка также не должна возникать (Player
определено в заголовке «все остальное»), и размещение этого заголовка прямо в AIState_Generic.h
ничего не меняет. Форвардная декларация ничего не делает.
Я даже пытался скопировать весь класс AIState
в AIState_Generic.h
, но это все равно не исправило ошибку 2 - и, что еще хуже, не было ошибок при отказе от реализации чисто виртуальной функции PieceMoved()
.
РЕДАКТИРОВАТЬ: Эти два файла - единственное, что может быть проблемой; остальное - функциональный унаследованный код. Проект в VS2008.
Перемещение include
s за пределы ifndef
s увеличивает количество ошибок "не знаю", игрок ", в дополнение к появлению новой ошибки:
error C2660: 'AIState::Move' : function does not take 1 arguments
... несмотря на то, что это невероятно очевидно. Однако, похоже, что он восстанавливает наследование, поскольку выдает ошибки о том, что не переопределяет чисто виртуальную функцию.