静态类数据成员和构造函数

时间:2010-06-07 20:34:27

标签: c++ static constructor member

如何使用所有静态方法访问类中的静态成员?

我想拥有一组相关的函数,但是在调用这些函数之前还要初始化一些重要的数据成员。我认为只有静态成员的课程才有可能。 VS2008中的编译器不喜欢我试图访问“a”。

当然,我错过了一些小但仍然很困惑的东西。 :P (即使没有“a”的无效访问,从main调用testMethod()时也不会调用构造函数。

class IPAddressResolver
{
private:

public:
    static int a;
    IPAddressResolver();
    static void TestMethod();
};


IPAddressResolver::IPAddressResolver()
{
    IPAddressResolver::a = 0;
    cout << "Creating IPAddressResolver" << endl;
}

void IPAddressResolver::TestMethod()
{
    cout << "testMethod" << endl;
}

3 个答案:

答案 0 :(得分:11)

您需要在函数之外定义静态数据成员,例如

class IPAddressResolver
{
private:
    static int a;
    IPAddressResolver();
public:
    static void TestMethod();
};

int IPAddressResolver::a = 0;

void IPAddressResolver::TestMethod()
{
    cout << "testMethod" << endl;
}

您的构造函数未被调用,因为您没有创建该类的新实例。对于静态实用程序类,您不需要实例,因此可以完全省略构造函数。或者,您可能希望声明它private以明确表示该类不会被实例化(参见上文)。

注意:

  • 建议不要在课程中使用public字段,因此我将a转为private
  • 静态实用程序类通常是无状态的,因此如果您需要在类中包含字段,这可能表示该类最好是Singleton

答案 1 :(得分:2)

在类定义之外的某处,您需要定义和初始化与该类关联的静态数据成员。

最简单的就是放

int IPAddressResolver::a = 0;
在您的IPAddressResolver.cpp文件中。

答案 2 :(得分:2)

我想拥有一组相关的函数,但在调用任何这些函数之前还要初始化一些重要的数据成员

听起来像你想要一个Singleton,而不是只有静态成员的类。