Похоже, что заголовочные файлы игнорируются / Наследование не работает - PullRequest
0 голосов
/ 09 февраля 2012

Вероятно, кому-то будет действительно легко обнаружить проблему здесь, но я пробиваю это уже более часа и не могу заставить что-то работать.

код:

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:

  1. ошибка C2504: «AIState»: базовый класс не определен
  2. ошибка 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

... несмотря на то, что это невероятно очевидно. Однако, похоже, что он восстанавливает наследование, поскольку выдает ошибки о том, что не переопределяет чисто виртуальную функцию.

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

Я бы предположил, что что-то в everythingelse.h включает файл AIState_Generic.h - потому что теперь AISTATE_H определяет содержимое AIState.h, когда оно включено в AIState_generic.h, исключается защитой #ifndef.

Мне кажется, что everythingelse.h должен находиться за пределами #ifndef (но иметь собственные средства защиты заголовков для предотвращения множественных компиляций)

1 голос
/ 09 февраля 2012

Пробуя эти два файла и объявляя Player вместо отсутствующего "everythingelse.h", он компилируется нормально для меня.Я лично подозреваю, что вы пропустили некоторые важные детали, имеющие отношение к проблеме.Это могут быть

  1. класс AIState определен в пространстве имен
  2. что-то в "everythingelse.h" определяет имя макроса AISTATE_H
  3. что-то еще

Чтобы посмотреть, что происходит, я бы использовал вездесущий флаг компилятора -E или /E, чтобы увидеть результат предварительной обработки файла.Это должно показать, где определены AIState и Player.

Относительно другой "ошибки", то есть того факта, что компилятор молчит о том, что PieceMoved() не переопределяется, можно ожидать:производный от AIState_Generic и определение функции там.Вы получите ошибку, если попытаетесь создать объект типа AIState_Generic.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...