gpt4 book ai didi

c++ - 从静态函数调用非静态变量

转载 作者:行者123 更新时间:2023-11-30 01:44:53 27 4
gpt4 key购买 nike

我最近开始使用 C++,我偶然发现了一个我似乎无法理解的问题。

class MyClass
{
bool eventActive = false;

static bool JoinCommand()
{
if (eventActive == true) // eventActive error: "a nonstatic member reference must be relative to a specific object"
{
// do something here...
}
else
{

}
};

我需要 JoinCommand 是静态的,但我还需要使用 eventActive,它需要是非静态的,并且由同一类中的其他函数使用/修改.因此我不能将 eventActive 设为静态,因为我还需要将其设为常量。

错误:“非静态成员引用必须相对于特定对象”

我想我无法创建 MyClass 的新实例。那么我该如何处理呢?或者有什么我不明白/我误解的地方吗?任何帮助将不胜感激。


编辑:

感谢大家在这方面帮助我。我完成了我想要实现的目标,但在学习新事物时我偶然发现了另一个与这个问题有点接近的问题。

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?
}
};

最佳答案

根据定义,类的静态成员函数独立于类的任何非静态成员的状态。这意味着您可以在没有对象的情况下使用它。

一旦您依赖非静态成员,您的函数就必须是非静态的:

class MyClass
{
bool eventActive = false;
public:
bool JoinCommand() // non static, because
{
if (eventActive == true) // it depends clearly on the state of the object
{ /* do something here... */ }
}
};

然后您可以按预期调用您的成员函数:

MyClass omc; 
if (omc.JoinCommand())
cout << "Command joined successfully"<<endl;

如果您仍然有正当理由将函数保持静态:

在静态成员函数中访问非静态元素的唯一方法是告诉函数它必须使用哪个对象来访问非静态元素(参数、全局对象等)。就像你在类里面所做的那样。

示例:

class MyClass
{
bool eventActive = false;
public:
static bool JoinCommand(MyClass& omc) // example by provding a parameter
{
if (omc.eventActive == true) // access non static of that object
{ /* do something here... */ }
}
};

你可以这样调用它:

MyClass obj; 
if (MyClass::JoinCommand(obj)) // a little bit clumsy, isn't it ?
...

关于c++ - 从静态函数调用非静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35370901/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com