C++函数/调用何时应该是静态/非静态的
C++ When should a function/ call be static/ non-static?
我在一个名为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);
};
- 何时应通过引用传递矢量参数而不是按值传递矢量参数?
- 何时应在构造函数参数中使用 const C++?
- 为什么或何时应在调用之前将可调用函数参数强制转换为右值?
- 点云库 (PCL) - 声明点云时何时应使用 ::P tr 的经验法则?
- 何时应使用 C++ 固定宽度整数类型,它们如何影响性能?
- 记录器何时应刷新
- 何时应使用 [[maybe_unused]]
- 何时应在现代C++中使用(非标头)源文件
- 何时应使用模板化参数与构造参数
- 关键部分或静音是否真的是成员变量,或者何时应成为成员变量
- 何时应存储指向函数的引用或指针?
- 何时应在Qt中将子对象声明为其父类的成员变量
- 何时应找到附加到模型的边界框的最小值和最大值
- 何时应删除默认的移动构造函数时令人困惑的事情
- 何时应使用make_heap与优先级队列
- 何时应通过常量引用传递运算符重载函数的参数
- 何时应防止隐式销毁?它是如何工作的
- 何时应使用std::atomic_compare_exchange_strong
- 何时应在非成员函数之前编写关键字 'static'?
- 什么是"is-implemented-in-terms-of"关系,何时应使用它?