c++ - 为什么静态成员函数只能在类定义中声明为静态,而不能在其自己的定义中声明?

标签 c++ static member-functions

在实现用于在屏幕上创建/更新框的类时,我想添加一个静态成员函数,以确保当前可见的框没有重叠(将其信息从静态指针数组获取到所有当前可见的框)

我的初始代码具有以下结构:

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/

相关文章:

c++ - map 模板类

c++ - 在 C++ 中给定单词的字符串 vector 创建一个短语

c++ - 使用二进制文件进行简单的高分更新

C++ copy_if lambda 捕获 std::string

static - Ada 编译问题(寻找我没有的 adbs?)

c++ - std::set 没有前后成员函数是否有设计原因?

c++ - 使用 Boost 图库的 adjacency_matrix

Django 媒体文件在生产中未显示为 Debug = False - Django 1.10

c# - 如何在静态类中调用类

c++ - LuaBridge 和成员函数