以下是我使用的头文件和cpp文件
头文件
#include "2d/Vector2D.h"#include <list>#include "../../AbstTargetingSystem.h"class AbstRaven_Bot;class Fletcher_getClosestBotStrategy{public: Fletcher_getClosestBotStrategy() {} Fletcher_getClosestBotStrategy(AbstRaven_Bot* owner); //每次调用此方法时,会检查所有者感官记忆中的对手,并将最近的对手分配给m_pCurrentTarget。
//如果在所有者的记忆范围内没有对手的记忆记录被更新,则当前目标设置为null
void pickTarget();};class Fletcher_TargetingSystem : public AbstTargetingSystem{public: Fletcher_TargetingSystem(AbstRaven_Bot* owner); //每次调用此方法时,会检查所有者感官记忆中的对手,并将最近的对手分配给m_pCurrentTarget。
//如果在所有者的记忆范围内没有对手的记忆记录被更新,则当前目标设置为null
void Update(); void closestBotStrategy(); void setCurrentTarget(AbstRaven_Bot* t); AbstRaven_Bot* getCurrentTarget(); void setCurrentOwner(AbstRaven_Bot* t); AbstRaven_Bot* getCurrentOwner();};#endif
cpp文件
#include "Fletcher_TargetingSystem.h"#include "../../AbstRaven_Bot.h"#include "../../Raven_SensoryMemory.h"#include "../../Debug/DebugConsole.h"//-------------------------------- ctor ---------------------------------------//-----------------------------------------------------------------------------Fletcher_TargetingSystem::Fletcher_TargetingSystem(AbstRaven_Bot* owner):AbstTargetingSystem(owner){}//-------------------------------- ctor ---------------------------------------//-----------------------------------------------------------------------------Fletcher_getClosestBotStrategy::Fletcher_getClosestBotStrategy(AbstRaven_Bot* owner){}//----------------------------- Update ----------------------------------------//-----------------------------------------------------------------------------//#define script AbstTargetingSystem::Instance()//class AbstTargetingSystem;//----------------------------- closestPlayer ----------------------------------------//-----------------------------------------------------------------------------void Fletcher_getClosestBotStrategy::pickTarget(){ double ClosestDistSoFar = MaxDouble; for (curBot; curBot != SensedBots.end(); ++curBot) { //确保机器人是活的,并且不是所有者
if ((*curBot)->isAlive() && (*curBot != getCurrentOwner()) ) { double dist = Vec2DDistanceSq((*curBot)->Pos(), getCurrentOwner()->Pos()); if (dist < ClosestDistSoFar) { ClosestDistSoFar = dist; setCurrentTarget(*curBot);// = *curBot; } } }}void Fletcher_TargetingSystem::Update(){ // currentStrategy = targetClosestBotStrategy; // target = currentStrategy.pickTarget(); std::list<AbstRaven_Bot*> SensedBots; SensedBots = getCurrentOwner()->GetSensoryMem()->GetListOfRecentlySensedOpponents(); std::list<AbstRaven_Bot*>::const_iterator curBot = SensedBots.begin(); setCurrentTarget(0);// = 0; Fletcher_getClosestBotStrategy* fGCBS = new Fletcher_getClosestBotStrategy(this->getCurrentOwner()); fGCBS->pickTarget();}AbstRaven_Bot* Fletcher_TargetingSystem::getCurrentOwner(){ return m_pOwner;}AbstRaven_Bot* Fletcher_TargetingSystem::getCurrentTarget(){ return m_pCurrentTarget;}void Fletcher_TargetingSystem::setCurrentTarget(AbstRaven_Bot* t){ m_pCurrentTarget = t;}void Fletcher_TargetingSystem::setCurrentOwner(AbstRaven_Bot* t){ m_pOwner = m_pOwner;}
在void Fletcher_getClosestBotStrategy::pickTarget()
中,我试图访问void Fletcher_TargetingSystem::Update()
中的curBot
和SensedBot
方法。我还想访问void Fletcher_TargetingSystem::setCurrentOwner(AbstRaven_Bot* t)
以及其他三个类似的方法
任何帮助都将不胜感激。
回答:
在你的方法Fletcher_getClosestBotStrategy::pickTarget()
中,你无法访问Fletcher_TargetingSystem::Update()
中的变量curBot
和SensedBot
,因为它们是局部变量。
因此,如果你确实需要访问它们,将它们转换为Fletcher_TargetingSystem
类的属性,创建setter和getter方法,并尽量避免使用friend
类,重新定义你的类依赖关系:将Fletcher_TargetingSystem
的常量引用传递给你的Fletcher_getClosestBotStrategy
方法:
例如:
class Fletcher_getClosestBotStrategy{ void pickTarget(const Fletcher_TargetingSystem & targeting); ....};....class Fletcher_TargetingSystem { protected: std::list<AbstRaven_Bot*> SensedBots; public: std::list<AbstRaven_Bot*> & getSensedBots() const { return SensedBots; }};void Fletcher_getClosestBotStrategy::pickTarget(const Fletcher_TargetingSystem & targeting){ double ClosestDistSoFar = MaxDouble; std::list<AbstRaven_Bot*> & myLocalSensedBots = targeting.getSensedBots(); ...}