我正在尝试为我一直在研究的大型程序添加另一个函数。这是一款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);
以及下面的所有内容,但这会引发错误。
这可能不是解决问题的足够信息,但如果可以,我会对有关该方法的任何解释感到满意。
答案 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->