从静态函数调用非静态变量
Posted
技术标签:
【中文标题】从静态函数调用非静态变量【英文标题】:Calling a non-static variable from a static function 【发布时间】:2016-02-15 16:50:03 【问题描述】:我在学习C++的过程中尝试做某事时遇到了一个问题,不知道该如何处理:
class Command
public:
const char * Name;
uint32 Permission;
bool (*Handler)(EmpH*, const char* args); // I do not want to change this by adding more arguments
;
class MyClass : public CommandScript
public:
MyClass() : CommandScript("listscript")
bool isActive = false;
Command* GetCommands() const
static Command commandtable[] =
"showlist", 3, &DoShowlistCommand // Maybe handle that differently to fix the problem I've mentioned below?
;
return commandtable;
static bool DoShowlistCommand(EmpH * handler, const char * args)
// I need to use isActive here for IF statements but I cannot because
// DoShowlistCommand is static and isActive is not static.
// I cannot pass it as a parameter either because I do not want to
// change the structure of class Command at all
// Is there a way to do it?
;
任何帮助将不胜感激! :)
【问题讨论】:
如果我理解得很好,您需要该函数是静态的,以便将其作为函数指针放在您的 Command 类中? 您需要isActive
做什么?您想知道哪个对象是否处于活动状态?我认为您的逻辑有误,因为没有对象,就没有调用非静态方法的意义。我不确定,但是如果您想知道commandtable
中的命令是否处于活动状态,那么只需在这些对象上调用方法commandtable[i].isActive();
@Christophe 是的,这是正确的。
@Chogart 抱歉,我正在回家的路上。我不完全清楚,如果您打算在表中有一个 MyClass 函数,或者表中的所有函数是否都是 MyClass 函数,也不是 CommandScript 中的函数。尽管如此,我还是为您的问题提出了一些替代方案,希望对您有所帮助。 .
【参考方案1】:
// Is there a way to do it?
没有。
要么将其作为参数传递,要么将其设为静态,要么将 DoShowlistCommand
设为非静态。
【讨论】:
不会使 bool static 也需要 const 吗?这意味着如果需要我将无法修改布尔值? @Chogart:为什么需要const
?
@zenith 好吧,我在类本身中初始化它,这需要成员为 const
@Chogart 好吧,那你可以在outside初始化它。【参考方案2】:
这里有两个可能的答案:
1。关于在静态函数中使用非静态项:
正如our previous question/answer 中所说,这是不可能的,除非您在静态函数中有一个特定的MyClass
对象(并使用object.isActive
)。不幸的是,您不能在此处执行此操作:
MyClass
参数;
现有参数并不表明您已经有一个指向父类对象的指针;
在这种情况下使用全局对象是不可取的。
2。关于你想要做什么:
您似乎希望函数静态,因为您想在将脚本命令映射到函数指针的表中提供它。
替代A
如果commandtable
中使用的所有函数指针都是MyClass
的成员,您可以考虑使用指向成员函数的指针而不是指向函数的指针。在对象上设置 isActive 的外部对象/函数然后可以在它知道的 MyClass 对象上引用指向成员函数的指针。
备选方案 B
使用command design pattern 修改代码设计以实现脚本引擎:它非常适合此类问题。这将需要对您的代码进行一些重构,但之后它会变得更加可维护和可扩展!
【讨论】:
这个命令设计模式很简洁。它可以帮助我约会!令人惊讶的是我使用它的频率。我感激不尽。 @Chogart 我很高兴收到您的反馈,并且知道这个答案对您的帮助超出了这个具体的问题:您成就了我的一天! :-)【参考方案3】:我认为没有任何方法可以做到这一点。原因如下: 静态成员函数不附加到任何特定对象,这意味着它无法访问其他非静态成员,因为它们附加到对象。
看起来您不需要将其设为静态成员。如果您确定这样做 - 然后将其作为参数传递。例如,制作一个
bool isActive();
函数,并在您调用此“有问题的”函数时将参数从它传递给该函数。
您也可以将成员变量更改为静态,但看起来每个对象都需要它,而不是一个对象
【讨论】:
以上是关于从静态函数调用非静态变量的主要内容,如果未能解决你的问题,请参考以下文章