【问题标题】:C++ Initialize class static data memberC++初始化类静态数据成员
【发布时间】:2010-11-16 07:32:08
【问题描述】:

我有一个类,它有一些静态函数来执行一些计算。但是,在计算之前,我需要传入一个数据来初始化一些静态数据成员。目前我有一个 init(data) 函数和一个 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();
 }

谢谢

【问题讨论】:

  • 静态函数如何依赖于您的对象状态?
  • 不清楚您是想对类的每个对象使用initclearResource,还是对所有对象只使用一次。
  • 好吧,如果你有一个依赖于状态的函数,那么你应该将wrap the state and the function 放入它自己的类中,该类封装了所有这些信息。然后这个新类的构造函数/析构函数会自动处理以上所有。
  • 你真的应该重新审视你的设计。请注意,只有描述清楚地表明您的程序永远不会支持多线程(必须在使用 functionA 的每个线程中修改静态变量,无论是在进入之前还是在完成之后。如果第二个线程尝试调用该函数,而第一个线程在里面,它会在操作过程中改变global
  • 感谢@David 的回复:您能详细说明一下多线程部分吗?我不太明白。我不需要修改 int a 的值,它只需要在程序开始时初始化一次。那还会带来问题吗?谢谢。

标签: c++


【解决方案1】:

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

【讨论】:

    【解决方案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();
    }
    

    【讨论】:

    • 无论如何都不好,但满足问题要求......如果设置它是一个要求,我会省略默认值。
    • 如果它是一个(类)对象而不是原始数据类型,那么使用这个解决方案如何释放“a”?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 不,不,不要确保唯一性,不要考虑单例模式。
      • 尝试强制唯一性通常没有什么意义,但尝试中会出现许多问题......这是不值得的。
      • @DeadMG:在这种特殊情况下,OP 不太可能需要唯一性,因此我删除了对 Singleton 的引用。虽然如果没有看到实际(非示例)代码,我不会那么肯定。
      【解决方案5】:

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

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

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多