здравствуйте. кто-нибудь может мне прояснить, что в этом коде не так (или же, в его проектировании). я уже долго бьюсь, но не могу разрулить эти грабли. буду благодарен вразумительным пояснениям. есть один абстр. класс baseBot. Код (Text): //baseBot.h namespace irr { class baseGame; /* тут компилер ругается: botPlayer.h: invalid use of undefined type `struct irr::baseGame' */ class baseBot { public: baseBot( baseGame *pOwner = NULL ) : _pOwnerGame(pOwner) {} //etc protected: baseGame *_pOwnerGame; }; } где класс baseGame выглядит так: Код (Text): //baseGame.h // include botPlayer class #include "botPlayer.h" // include botMonster class #include "botMonster.h" namespace irr { class baseBot; class baseGame { public: void someMethod(); int getI() const { return i; } //etc private botPlayer *_player; int _i; }; } void baseGame::someMethod() { _player = new botPlayer( this ); //... } далее, из baseBot-a выведен botPlayer: Код (Text): //botPlayer.h #include "baseBot.h" namespace irr { class botPlayer : public baseBot { public: botPlayer(baseGame *pOwner); //etc }; } botPlayer::botPlayer(baseGame *pOwner) { /* тут компилер ругается: botPlayer.h: invalid use of undefined type `struct irr::baseGame' */ //обращаемся через pOwner к методам класса baseGame и делаем нек. действия int Value = pOwner->getI(); } т.е. кто не понял, смысл таков: есть абстр. класс baseBot, кот-й содержит указатель на главный класс baseGame, кот-й всем рулит (в частности, и этим baseBot-ом). далее, из baseBot выведен класс botPlayer. конкретные объекты класса botPlayer создаются в главном классе baseGame, и посему, чтобы из botPlayer-а (да и вообще, всех baseBot-ов) можно было иметь связь с "внешним миром", им в конструкторе из метода baseGame, где они создаются, передается указатель на этот baseGame. т.е. мне хочется сделать взаимопроникаемую систему, где baseGame будет содержать все baseBot-ы (и его потомков), и будет рулить ими, а baseBot-ы вместе с потомками будут иметь возможность "добираться" до методов baseGame-а, и всяких его "настроек". можете пояснить, как мне пофиксить эти ошибки? мне непонятно, почему в botPlayer::botPlayer(baseGame *pOwner) компилер "видит" класс baseGame, а далее в теле метода уже не видит.
varnie Ругается компилятор скорее всего на то, что ты в botPlayer.h пытаешься вызывать методы baseGame, который еще не определён, определён только указатель на него. Вынеси реализацию методов в cpp-файл и попробуй включить туда baseGame.h. На мой взгяд позволять ботам вызывать все методы baseGame не есть хорошо, раз есть метод который создаёт бота, значит должен быть метод который его удаляет, и если бот вдруг надумает его вызвать, программа скорее всего упадёт. Думаю лучше создать интерфейс IForBots с методами которые нужны ботам и наследовать baseGame от него, а ботам передавать указатель на IForBots.
fr0b-p, так у меня класс botPlayer и его реализация и так в одном нэймспейсе. все это у меня в botPlayer.h идет. black mirror, поясни еще раз пожалуйста - что и куда включить, а то я не оч понял.
namespace irr { class botPlayer : public baseBot { public: botPlayer(baseGame *pOwner); //etc }; } botPlayer::botPlayer(baseGame *pOwner) {
varnie h-файлы для ботов делаешь так: Код (Text): #ifndef _botXX_h_ #define _botXX_h_ //сюда можно включить что угодно за исключением baseGame.h class gameGame; class botXX { //здесь используешь только указатели или ссылки на baseGame baseGame *g; someMethod(...,baseGame*a,...); }; #endif cpp-файлы для ботов: Код (Text): #include "botXX.h" #include "baseGame.h" //сюда включаются остальные файлы botXX::someMethod(...) { //здесь можно вызывать методы baseGame g->someMethod(...); } c baseGame желательно поступить так же, то есть в определении класса используем только указатели на ботов, а в реализации уже вызываем их методы.
varnie - так сейчас сделано не правильно ! объявление классов botPlayer и baseGame сделаны в namespace irr a botPlayer::botPlayer(baseGame *pOwner) в глобальном неймспейсе ! после исправления этого и пары других опечаток все скомпилицо
да, все было так как вы и сказали. спасибо за помощь! и пардон что так поздно на связь вышел. я тут пропадал просто кое-где. тема закрыта.