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