我在一个名为spiral.cpp
的C ++源文件中定义了一个函数,我试图从另一个名为manager.cpp
的C ++源文件中调用该函数。但是,我收到一个编译错误,说明非法调用非静态成员函数"。
我已经了解了导致编译错误的原因,到目前为止我发现的所有内容似乎都告诉我,我需要在其定义中创建函数static
。但是,如果我这样做,那么我会收到一个编译错误,指出"'静态'不应该用于文件范围"。
该函数在spiral.cpp
中定义,代码为:
int spiralItem::updateCircuitNumber(void){
...
}
然后在manager.cpp
中使用以下行调用它:
spiral::updateCircuitNumber();
有谁可以向我解释我在这里做错了什么?问题肯定与正确定义/被称为静态/非静态的函数有关,还是其他的?
答案 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);
};