我需要在头文件中前向声明一个类,如下所示:
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/