C ++初始化类静态数据成员

时间:2010-11-16 07:32:08

标签: c++

我有一个具有许多静态函数的类来执行一些计算。但是,在计算之前,我需要传入一个数据来初始化一些静态数据成员。目前我有一个init(数据)函数和一个clearResource()函数,应该在使用类之前和之后调用它。有没有更好的方法呢?

例如:

classA(){
 static int a;
 static init(int b) {
    a = b;
 }
 static functionA(){
   //perform something based on value of a;
    switch(a){
    }
 }

}

int main(){
  classA::init(5);
  classA::functionA();
 }

由于

5 个答案:

答案 0 :(得分:2)

避免使用静态成员函数:让构造函数初始化数据,析构函数清除资源(参见RAII)。如果无法更改现有类,请实现一个辅助类,该类从其构造函数调用init,并从其析构函数调用clearResource

答案 1 :(得分:2)

您可以使用这种设计

class A()
{
public:
 static int a;
 static void functionA(int arg = A::a)
 {
  if(A::a != arg)
   A::a = arg;
  ...
 }
};

int A::a = 0;
int main()
{
 A::functionA();
}

答案 2 :(得分:1)

您应该应用RAII概念:请参阅thisthis个问题。

答案 3 :(得分:1)

使成员函数和数据非静态,在构造函数中初始化并释放析构函数中的资源。这将保证正确的调用顺序:初始化 - 执行操作 - 客户端代码中的免费资源。

答案 4 :(得分:1)

在这种情况下,我会避免使用静态成员。

这是你的问题。您有一个类处理某些数据。无论出于何种原因,该数据都需要在此处理类的所有实例之间共享。那么,我们有一个非静态的解决方案!

class Data : boost::noncopyable
{
public:
    Data()
    {
        // initialise all of our data.
    }; // eo ctor
}; // eo class Data

您实例化此课程的地方取决于您。它可以是在启动时运行的应用程序类的成员,也可以是某个根目录的一部分。它只需要是可访问的,不需要是静态的,也不需要单独的。

class DataProcessor
{
private:
    Data& m_Data;

public:
    DataProcessor(Data& _data) : m_Data(_data)
    {
    }; // eo ctor
}; // eo class DataProcessor