在实现用于在屏幕上创建/更新框的类时,我想添加一个静态成员函数,以确保当前可见的框没有重叠(将其信息从静态指针数组获取到所有当前可见的框)
我的初始代码具有以下结构:
class Box
{
public:
// ...
static void arrangeOverlappingBoxes();
};
static void Box::arrangeOverlappingBoxes()
{
// ...
}
我很惊讶这会产生错误 C2724: 'static' should not be used on member functions defined at file scope.
经过一些试验、google 和错误,我发现我的函数定义应该丢失关键字 static
,即它应该是
void Box::arrangeOverlappingBoxes()
{
// ...
}
但我不知道这背后的基本原理是什么。在类定义和自己的定义中声明不同的函数头似乎是不对称和困惑的。这有什么原因吗?
最佳答案
您的类定义(在头文件中)将为函数提供所需的任何属性:
- 静态
- 内联
- 虚拟
考虑到每个进一步的对象都将使用 .h 查看您的类定义,那么在此处定义这些属性是有意义的。
此外,该类中的每个函数都将在派生类中保留其属性(例如,您只需在基类中声明析构函数为虚拟,随后的每个继承都会将该析构函数视为虚拟)。
在您的实现主体中重新声明这些属性是没有意义的。
必须在 .h 和 .cpp 文件中声明函数属性实际上会导致很多问题。 想象一下这种情况:您在 .h 文件中将函数声明为虚拟函数,在 .cpp 文件中声明为静态函数。编译器会做什么?虚拟的还是静态的? (或者更可能是编译错误,但编译器错误只会促使您在 .cpp 文件中匹配 header 中的声明。您不能根据“静态”或“虚拟”重载函数)。
关于c++ - 为什么静态成员函数只能在类定义中声明为静态,而不能在其自己的定义中声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25977268/