【问题标题】:get access top variables and methods in a different class访问不同类中的顶级变量和方法
【发布时间】:2013-04-11 12:12:27
【问题描述】:

下面是我使用的头文件和cpp文件

标题

#include "2d/Vector2D.h"
#include <list>
#include "../../AbstTargetingSystem.h"


class AbstRaven_Bot;




class Fletcher_getClosestBotStrategy
{

public:
    Fletcher_getClosestBotStrategy()
    {}
    Fletcher_getClosestBotStrategy(AbstRaven_Bot* owner);

    //each time this method is called the opponents in the owner's sensory 
    //memory are examined and the closest  is assigned to m_pCurrentTarget.
    //if there are no opponents that have had their memory records updated
    //within the memory span of the owner then the current target is set
    //to null

    void       pickTarget();
};
class Fletcher_TargetingSystem : public AbstTargetingSystem
{

public:
    Fletcher_TargetingSystem(AbstRaven_Bot* owner);

    //each time this method is called the opponents in the owner's sensory 
    //memory are examined and the closest  is assigned to m_pCurrentTarget.
    //if there are no opponents that have had their memory records updated
    //within the memory span of the owner then the current target is set
    //to 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)
    {
        //make sure the bot is alive and that it is not the owner
        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) 和其他 3 类似于 dat

感谢任何帮助。

【问题讨论】:

    标签: c++ visual-c++ artificial-intelligence


    【解决方案1】:

    从您的方法Fletcher_getClosestBotStrategy::pickTarget() 中,您无法访问Fletcher_TargetingSystem::Update() 变量curBotSensedBot,因为它们是局部变量。

    因此,如果您确实需要访问它们,请将它们转换为 Fletcher_TargetingSystem 类属性,创建 setter 和 getter,并尝试避免 friend 类,重新定义您的类依赖项:传递 Fletcher_TargetingSystem const参考您的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();
        ...
    }
    

    【讨论】:

    • 当然这会报错,这是一个解释,不是真正的代码。如果您需要访问Fletcher_TargetingSystem 公共方法,请将对Fletcher_TargetingSystem 对象的有效引用传递给Fletcher_getClosestBotStrategy::pickTarget(),正如我告诉您的那样。但是,正如我所写的,您将永远无法在 Fletcher_TargetingSystem::Update() 之外访问 curBotSensedBots,因为它们是局部变量。我希望这会有所帮助。
    • 用新代码编辑你的问题,我想你忘记了类名:必须是void Fletcher_getClosestBotStrategy::pickTarget(Fletcher_TargetingSystem &amp; targeting)
    • 您需要从哪里访问?
    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多