我想在另一个文件中声明一个类的静态成员函数。我想做的事情是这样的:
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显着影响编译时间,并且包含在任何地方。)
答案 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();
}
它不是最漂亮的,但它会省去你必须包括整个标题..