我有一个存储类型集合的类。其他类使用第一类中的静态方法注册此类型。
以下是一些代码:
在文件classA.h中
class A {
static void RegisterType(std::string name, bool (*checkType)(Json::Value toCheck));
}
在文件classB.h中
class B {
static bool CheckType(Json::Value toCheck);
}
在文件classB.cpp
中// In global scope
A::RegisterType("B", &B::CheckType);
当我在classB.cpp中执行此操作时,我的编译器(Visual Studio 2010)认为我想重新声明A::RegisterType()
函数。
我尝试将A::RegisterType()
的返回类型从void
更改为bool
。然后将返回的值赋给classB.cpp中的变量:
// In global scope
bool tmp = A::RegisterType("B", &B::CheckType);
这种方式确实有效,但我在全局范围内添加了一个变量,我不想这样做。
如何在不将结果分配给变量的情况下从全局范围调用A::RegisterType()
?
另一个问题是如何在classB.cpp中注册“B”类型?
答案 0 :(得分:3)
C ++中没有“独立”函数调用:您可以从另一个静态方法调用RegisterType()
(例如,来自main()
)
解决方法是模仿静态构造函数:
struct StaticInit
{
StaticInit()
{
A::RegisterType("B", &B::CheckType);
}
};
class B
{
// ...
static StaticInit si; // Will force the static initialization
};
答案 1 :(得分:2)
您无法在文件的全局范围内调用函数。它必须具有与程序的main()
函数之一相关的范围(例如,如果你进入调用堆栈,最终进入main()
函数),或者您创建静态对象的类/结构的构造函数的范围。
未执行cpp文件。它只包含将被编译的代码。
在您的情况下,您可以在cpp文件中创建自定义类的静态变量,其默认构造函数调用此函数。
答案 2 :(得分:1)
从语言律师的角度来看,3.5 Program and linkage
表示:
程序由一个或多个链接在一起的翻译单元(第2章)组成。翻译单元由一系列声明组成。
因此,您无法在全局范围内使用语句,您必须按quantdev的建议将调用放在main()
内或某个静态变量的构造函数内。
答案 3 :(得分:0)
通常,CPP将全局范围内的A::RegisterType("B", &B::CheckType);
视为声明,而不是将其作为函数调用调用。
因此,您必须按照bool tmp = A::RegisterType("B", &B::CheckType);
中提到的那样将其分配给全局变量,或者您必须按quantdev