我需要在头文件中转发声明一个类,如下所示:
class MyStaticClass;
我理解为什么不能向前声明此类的数据成员。我曾经认为你可以向前声明函数。我想声明这个类的静态函数,如下所示:
class MyStaticClass;
static int MyStaticClass::AddTwoNumbers(const int a, const int b);
这给了我一个编译错误:
error C2027: use of undefined type 'MyStaticClass'
为什么不能这样做?或者毕竟有这样做的秘密方式吗?
答案 0 :(得分:3)
这是不允许的,因为它允许其他人将成员函数添加到类中,甚至不编辑类本身。
考虑一下,
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().
现在想象有人前来 - 前面 - 声明以下函数,就在包含定义上述类的标题之前:
static void X::f(int);
现在前一个调用X::f(0)
会给链接器错误(未解析的名称),因为现在0
不会转换为float
,因为它不需要因为有一个声明的函数接受int
,虽然它没有定义 - 更糟糕的是,如果它被定义,那么你甚至不会得到链接器错误,你可能不会轻易知道正在调用不同的函数。
Morever。 f(int)
现在也可以访问private
成员_data
- 通过这种方式,任何人都可以通过随意添加功能来访问任何私人/受保护成员。