在全局范围内调用静态方法

时间:2014-09-04 07:50:38

标签: c++ static

我有一个存储类型集合的类。其他类使用第一类中的静态方法注册此类型。

以下是一些代码:

在文件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”类型?

4 个答案:

答案 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

的建议进行操作