2010-11-16 101 views
1

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

例如:

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(); 
} 

感谢

+0

静态函数如何依赖于对象状态? – yadab 2010-11-16 07:35:18

+1

一些代码如何? – Chubsdad 2010-11-16 07:36:28

+0

目前还不清楚你是否想为你的类的每个对象使用'init'和'clearResource',或者对所有对象只使用一次。 – 2010-11-16 07:40:39

回答

2

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

1

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

+2

不,不确保唯一性并且不考虑Singleton模式。 – Puppy 2010-11-16 07:52:41

+0

有在试图强制唯一性通常小了点,但在试图引起许多问题......这不值得 – 2010-11-16 07:58:57

+0

@DeadMG:这是不可能的OP需要独特性这个特殊情况,所以我删除了对Singleton的引用。尽管如果没有看到实际的(非示例)代码,我不会那么确定。 – vitaut 2010-11-16 08:02:47

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(); 
} 
+1

通过任何方式都不好,但满足问题要求...如果将其设置为要求,我会省略默认值。 – 2010-11-16 08:58:06

+0

如何在使用此解决方案之后释放“a”,假设它是(类 - )对象而不是原始数据类型? – 2012-03-08 10:13:11

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