c++ - 为什么我不能前向声明静态函数?

标签 c++ static forward-declaration

我需要在头文件中前向声明一个类,如下所示:

class MyStaticClass;

我明白为什么不能前向声明此类的数据成员。我曾经认为你可以前向声明函数。我想声明这个类的静态函数,如下所示:

class MyStaticClass;
static int MyStaticClass::AddTwoNumbers(const int a, const int b);

这给了我一个编译错误:

error C2027: use of undefined type 'MyStaticClass'

为什么不能这样做?或者到底有什么 secret 方法可以做到这一点?

最佳答案

这是不允许的,因为它允许其他人向类添加成员函数,甚至无需编辑类本身。

考虑一下,

struct X
{
    static void f(float a) { std::cout << a << std::endl; }
 private:
    static int _data; //inaccessible to non-member
};

X::f(0); //convert 0 (an int) to float, and call X::f().

现在想象有人来并在包含定义上述类的 header 之前前向声明以下函数:

static void X::f(int);

现在是上一个电话X::f(0)会给出链接器错误(未解析的名称),因为现在 0不会转换为 float ,因为它不需要,因为有一个声明函数接受 int ,尽管它没有被定义——更糟糕的是,如果它被定义了,那么你甚至不会得到链接器错误,而且你可能不容易知道正在调用一个不同的函数。

而且。 f(int)现在可以访问private成员(member)_data同样,通过这种方式,任何人都可以通过随意添加功能来访问任何私有(private)/ protected 成员。

关于c++ - 为什么我不能前向声明静态函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29488922/

相关文章:

c++ - 使用函数指针作为成员函数的代理

c++ - 使用模板化接口(interface)导致 “Undefined reference to”

c++ - fstream 变量获取文本文件中的所有行

java - 我可以从静态方法调用非静态方法吗?

c++ - 为静态模板函数(非成员)提供友元?

c++ - 如何转发声明已在其他地方使用默认值转发声明的模板类型

C++随机数并在处理时等待所有子级的父级

java - Android - 无法对非静态字段进行静态引用

C++ intrusive_ptr 问题

c++ - 类前向声明​​ C++