我有一个具有许多静态函数的类来执行一些计算。但是,在计算之前,我需要传入一个数据来初始化一些静态数据成员。目前我有一个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();
}
由于
答案 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)
答案 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