从静态函数调用非静态变量

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)。不幸的是,您不能在此处执行此操作:

您的代码 cmets 清楚地表明您不能在函数调用中添加 MyClass 参数; 现有参数并不表明您已经有一个指向父类对象的指针; 在这种情况下使用全局对象是不可取的。

2。关于你想要做什么:

您似乎希望函数静态,因为您想在将脚本命令映射到函数指针的表中提供它。

替代A

如果commandtable 中使用的所有函数指针都是MyClass 的成员,您可以考虑使用指向成员函数的指针而不是指向函数的指针。在对象上设置 isActive 的外部对象/函数然后可以在它知道的 MyClass 对象上引用指向成员函数的指针。

备选方案 B

使用command design pattern 修改代码设计以实现脚本引擎:它非常适合此类问题。这将需要对您的代码进行一些重构,但之后它会变得更加可维护和可扩展!

【讨论】:

这个命令设计模式很简洁。它可以帮助我约会!令人惊讶的是我使用它的频率。我感激不尽。 @Chogart 我很高兴收到您的反馈,并且知道这个答案对您的帮助超出了这个具体的问题:您成就了我的一天! :-)【参考方案3】:

我认为没有任何方法可以做到这一点。原因如下: 静态成员函数不附加到任何特定对象,这意味着它无法访问其他非静态成员,因为它们附加到对象。

看起来您不需要将其设为静态成员。如果您确定这样做 - 然后将其作为参数传递。例如,制作一个

bool isActive();

函数,并在您调用此“有问题的”函数时将参数从它传递给该函数。

您也可以将成员变量更改为静态,但看起来每个对象都需要它,而不是一个对象

【讨论】:

以上是关于从静态函数调用非静态变量的主要内容,如果未能解决你的问题,请参考以下文章

MFC GetEditCtrl 报错非静态成员函数的非法调用

static小结

新手请教C#中关于静态函数和静态变量

关于类中静态成员函数和静态成员变量的知识点

class中static总结-静态成员函数和静态成员变量

如何从 Qt/C++ 的子函数中调用非静态父函数?