C++函数/调用何时应该是静态/非静态的

C++ When should a function/ call be static/ non-static?

本文关键字:静态 何时应 函数 调用 C++      更新时间:2023-10-16

我在一个名为spiral.cpp的C++源文件中定义了一个函数,我正试图从另一个名称为manager.cpp的C++源代码文件中调用该函数。然而,我收到一个编译错误,上面写着"非法调用非静态成员函数"。

我已经查找了出现此编译错误的原因,到目前为止我所发现的一切似乎都告诉我,我需要在函数定义中使用static。然而,如果我这样做,我会得到一个编译错误,说"不应该在文件范围内定义的成员函数上使用‘static’"。

该函数在spiral.cpp中定义,代码为:

int spiralItem::updateCircuitNumber(void){
    ...
}

然后在manager.cpp中用以下行调用:

spiral::updateCircuitNumber();

有人能向我解释一下我在这里做错了什么吗?这个问题肯定是因为函数被错误地定义/调用为静态/非静态,还是其他原因?

正如我在评论中提到的,您的函数名让我假设您实际上想要操作特定spiral实例的状态。在这种情况下,您将需要(或至少通常使用)成员函数。看来这就是你实际做的。检查现在,为了调用这个函数,您需要有一个spiral的实例,可以在上调用该函数。

spiral s;
s.updateCircuitNumber();

或(如果动态分配)

spiral * s = new spiral();  // better use appropriate smart_ptr but that's another story
s->updateCircuitNumber();

这些调用会更改特定s对象的状态。如果您有另一个spiral对象s2,它将保持不变,并且您可以根据需要为该实例调用updateCircuitNumber()非静态成员函数也称为实例函数

static函数也称为类函数,因为它们独立于该类的特定实例。因此,它们只能访问该类的静态成员,而不能访问非静态成员(因为这些成员只存在于不可用的特定实例中)。如其他答案中所述,static关键字仅添加在类声明内部。然后可以在尝试使用spiral::updateCircuitNumber();时调用静态函数。

您必须在类声明中使用static,但在函数定义中不能使用:

class spiralItem
{
...
public:
    static int updateCircuitNumber(void);
};

spiral.cpp:中

int spiralItem::updateCircuitNumber(void){
    ...
}

您在manager.cpp中通过编写以下内容调用函数:

spiralItem::updateCircuitNumber();

简单地将此视为C++的规则;一开始确实有点奇怪。

您可以在类中拥有静态成员函数。这里首先要注意的是,静态成员函数没有这个指针,这意味着您不能访问静态函数中类的任何数据成员/非静态成员函数,因为它们需要这个指针。第二点是可以在不实例化类的情况下调用静态成员函数。

例如:-

class One
{
private:
   static int count;
public:
  static int getCount ()
  {
    return count;
  }
};

您必须在.cpp文件中初始化计数:-

int One::count = 0;

然后你可以这样调用成员函数:-

std::cout << One::getCount () << std::endl;

您的错误可能在头文件中。如何声明静态方法?

以下是考虑您的示例时的样子:

class spiralItem {
public:
  static int updateCircuitNumber(void);
};