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

时间:2014-11-07 09:58:29

标签: c++ static function-declaration

我在一个名为spiral.cpp的C ++源文件中定义了一个函数,我试图从另一个名为manager.cpp的C ++源文件中调用该函数。但是,我收到一个编译错误,说明非法调用非静态成员函数"。

我已经了解了导致编译错误的原因,到目前为止我发现的所有内容似乎都告诉我,我需要在其定义中创建函数static。但是,如果我这样做,那么我会收到一个编译错误,指出"'静态'不应该用于文件范围"。

中定义的成员函数

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

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

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

spiral::updateCircuitNumber();

有谁可以向我解释我在这里做错了什么?问题肯定与正确定义/被称为静态/非静态的函数有关,还是其他的?

4 个答案:

答案 0 :(得分:3)

你必须在类声明中使用static,但在函数定义中使用不是

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

spiral.cpp

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

您可以通过以下方式调用manager.cpp中的函数:

spiralItem::updateCircuitNumber();

简单地认为这是C ++的规则;起初确实有点奇怪。

答案 1 :(得分:3)

正如我的评论中所提到的,您的函数名称让我假设您实际上想要操纵特定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();时调用静态函数。

答案 2 :(得分:1)

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

例如: -

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

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

int One::count = 0;

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

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

答案 3 :(得分:1)

您的错误可能在头文件中。你如何申报静态方法?

考虑你的例子,它应该是这样的:

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