forward声明静态函数c ++

时间:2010-04-16 19:27:21

标签: c++

我想在另一个文件中声明一个类的静态成员函数。我想做的事情是这样的:

BigMassiveHeader.h:

class foo
{
    static void init_foos();
}

Main.cpp的:

class foo;
void foo::init_foos();
int main(char** argv, int argc)
{
    foo::init_foos()
}

这失败了“错误C2027:使用未定义类型'foo'”

有没有办法完成我想要做的事情,让init_foos成为一个自由函数,或者包括BigMassiveHeader.h? (BigMassiveHeader.h显着影响编译时间,并且包含在任何地方。)

8 个答案:

答案 0 :(得分:10)

您不能转发声明类的成员,无论它们是否是静态的。

答案 1 :(得分:4)

你不能转发声明你的类的成员,但你可以在该命名空间内创建命名空间和函数,并转发声明。

namespace nsfoo
{
     void init_foos();
}

如果需要,您的课程可以使用此功能。

答案 2 :(得分:2)

如果您有BigMassiveHeader,则应考虑将其拆分为多个SmallCompactHeaders。如果要表示许多类和函数在语义上属于一起,则可以将它们放在同一名称空间中。您始终可以提供包含所有小标题的便捷标题。

答案 3 :(得分:0)

不,你需要包含标题。遗憾。

如果必须,请使用免费功能,或拆分课程。

答案 4 :(得分:0)

你不能在C ++中部分地声明类,所以要么你必须把类的声明放在它自己的,更小的标题中,或者......

在您的文件中包含BigMassiveHeader.h并使用预编译的标头。 Visual C ++方式:http://msdn.microsoft.com/en-us/library/2yzw0wyd%28v=VS.71%29.aspx,或GCC方式:http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html

答案 5 :(得分:0)

我知道这不是问题的关键,但如果BigMassiveHeader.h不太可能随着时间的推移发生太大变化,那么你应该看看precompiled headers

答案 6 :(得分:0)

作为第一次重构,我使用一个调用静态函数的自由函数。这并不像你的主要方法被多次调用,所以你不会注意到额外的调用,这对现有代码的改动最小。

当然,你实际上并没有说出你想做什么,只是说你想做什么。如果你要做的是在应用程序启动时调用一次init_foos,请使用静态对象初始化,而不是在main中调用它。如果您要创建的是在创建所有静态对象后调用init_foos,那么它就会更复杂。

通过静态对象初始化,我的意思是在.cpp文件中具有此权限,可以访问init_foos的定义。将其设为好友init_foos私有以防止多次通话:

struct call_init_foos {
  call_init_foos () { foo::init_foos(); }
} call_init_foos_on_startup;

答案 7 :(得分:0)

要转发类的单个方法的声明,必须将该方法声明为类的一部分(实际上是这样)。

例如,在您的情况下,添加到main.cpp:

class foo
{
public:
    static void init_foos();
}

它不是最漂亮的,但它会省去你必须包括整个标题..