不明白这个C ++方法是如何工作的,并希望做类似的事情

时间:2011-04-08 20:07:39

标签: c++

我正在尝试为我一直在研究的大型程序添加另一个函数。这是一款3D游戏,很多游戏都是在我到达之前建成的。如果我想添加一些内容,我通常会寻找其他已完成类似操作的地方,并根据这些内容进行更改。在这种情况下,我试图学习的方法是非常复杂的,我真的不知道发生了什么(因此不知道我需要改变什么,使它做我想要它做的事情做)。

这是常规方法:

    class Action_GoToZone : public Action {
    public:
        Action_GoToZone() {}
        void eval(const Dialog& dialog, State& state) const {
            ZoneParser::getSingleton().load("../media/zones/" + mZoneFilename, false);
            GameState::getSingleton()._changeState("GameMode");
        }

        static Action* Create(const Script2::Parser::List& list) {
            Action_GoToZone* action = new Action_GoToZone();

            if(list.size() != 1)
                throw Translator::TranslateException("GoToZone Action takes exactly one parameter");

            const Script2::Parser::ListElement& e1 = list.front();
            if(!e1.mIsIdentifier)
                throw Translator::TranslateException("GoToZone Action only takes identifiers");

            action->mZoneFilename = String(e1.mIdentifier.mString);
            action->mReturnFilename = ZoneParser::getSingleton().getLastFilename();

            return action;
        }

    private:
        String mZoneFilename;
        String mReturnFilename;
    };

我想让我的方法做的就是在不同的类中调用一个函数。以下是我的尝试:

class Action_SetJob : public Action {
    public:
        Action_SetJob() {}
        void eval(const Dialog& dialog, State& state) const {
            GameModeState::changeJob(1); //This is the class/function I want it to call.
        }

        static Action* Create(const Script2::Parser::List& list) {
            Action_SetJob* action = new Action_SetJob();

            if(list.size() != 1)
                throw Translator::TranslateException("SetJob Action takes exactly one parameter");

            const Script2::Parser::ListElement& e1 = list.front();
            if(!e1.mIsIdentifier)
                throw Translator::TranslateException("SetJob Action only takes identifiers");

            action->GameModeState::changeJob(1);

            return action;
    private:
        int changeJob;
        }   
    };

我真的不知道是什么动作 - >是...我尝试取出action->GameModeState::changeJob(1);以及下面的所有内容,但这会引发错误。

这可能不是解决问题的足够信息,但如果可以,我会对有关该方法的任何解释感到满意。

2 个答案:

答案 0 :(得分:2)

如果我理解你正在尝试做什么,那么这应该完成它:

class Action_SetJob : public Action {
public:
    Action_SetJob() {}
    void eval(const Dialog& dialog, State& state) const {
        GameModeState::changeJob(newJob);
    }

    static Action* Create(const Script2::Parser::List& list) {
        Action_SetJob* action = new Action_SetJob();

        if(list.size() != 1)
            throw Translator::TranslateException("SetJob Action takes exactly one parameter");

        const Script2::Parser::ListElement& e1 = list.front();
        if(!e1.mIsInteger)
            throw Translator::TranslateException("SetJob Action only takes integers");

        action->newJob = e1.mInteger.mInt;

        return action;
    }   
private:
    int newJob;
};

显然,由于C ++是上下文相关的(它实际上是一种不可判断的语言),我不知道你的类有哪些其他成员,所以我猜到了可能的情况。

您想要解析一个整数,当您评估该操作时,该整数可以传递给您尝试调用的函数。

这假设您的changeJob方法是静态的。如果它实际上不是静态的,你将不得不以某种方式找出目标对象;例如,您可以通过向脚本函数添加其他参数来实现此目的。

如果您想了解更多详情,我们需要更多信息!

答案 1 :(得分:0)

->是一个指针引用。看起来你的对象是指针(来自对象类型之后的*)。是指针操作还是其他问题?从你所写的内容来看,除了你提到action->

之外,我并不完全确定提供什么帮助。