【问题标题】:How to declare two different static variables? (C++)如何声明两个不同的静态变量? (C++)
【发布时间】:2010-11-03 03:43:14
【问题描述】:

编辑:将它们声明为私有是一个错字,我已修复它:

关于另一个问题,如果我在一个类中声明一个静态变量,然后从中派生一个类,有没有办法将静态变量声明为每个类的单独变量。即:

class A:
{
public:
static int x;
};
class B:A
{
public:
const static int x;
};

是否定义了两个不同的静态变量x,一个用于 A,一个用于 B,或者我会在重新定义 x 时收到错误,如果我确实收到错误,我该如何创建两个单独的静态变量变量?

【问题讨论】:

  • 大声笑我认为编译器会比我们这里的任何人更快更快地回答这个问题

标签: c++ inheritance static-variables


【解决方案1】:

当您使用静态变量时,明确引用它们可能是个好主意:

public class B:A
{
  public const static int x;
  public int foo()
  {
    return B::x;
  }
}

这样,即使层次结构中“高于”您的类决定创建一个名称相似的成员,它也不会破坏您的代码。同样,我通常在访问普通成员字段时尝试使用this 关键字。

更新以使用 C++ 语法。

【讨论】:

  • 请注意,这是 Java 语法。要在 C++ 中执行相同类型的显式引用,您需要使用范围运算符,例如B::x
  • 好吧,周围的其余代码仍然不是合法的 C++,但我认为提问者将能够翻译假设他对 C++ 足够熟悉。 :)
【解决方案2】:

这会创建两个单独的静态变量。

【讨论】:

    【解决方案3】:

    请注意,您已经隐式声明了这些私有:

    class A:
    {
      private:
      static int x;
    };
    class B:A
    {
      private:
      const static int x;
    };
    

    这意味着变量不相互竞争。

    【讨论】:

      【解决方案4】:

      如前所述,这会创建两个单独的变量:

      A::x;
      
      // and 
      
      B::x;
      

      事实上,如果您尝试在 B 的方法中仅使用“x”,则只会使用更接近的范围定义,直到您更精确为止:

      #include <iostream>
      
      class A
      {
      protected:
      static int x;
      
      public:
          A() { x = 7; }
      };
      
      int A::x = 22;
      
      class B:A
      {
      static const int x = 42;
      
      public:
      
          int a_x() const { return A::x; }
          int b_x() const { return B::x; }
          int my_x() const { return x; } // here we get the more local variable, that is B::x.
      };
      
      int main()
      {
          B b;
      
          std::cout << "A::x = " << b.a_x() << std::endl;
          std::cout << "B::x = " << b.b_x() << std::endl;
          std::cout << "b's x = " << b.my_x() << std::endl;
      
          std::cin.ignore();
          return 0;
      }
      

      输出:

      A::x = 7
      B::x = 42
      b's x = 42
      

      有人提到可访问性可能会限制可访问性:将基变量设为私有不会使其子类可访问。 但是,如果变量必须受保护或公开,请使用显式访问方法或依赖我刚刚演示的本地范围规则。

      【讨论】:

        【解决方案5】:

        如果您希望每个使用 A 的类都有一个单独的静态变量 - 您可以使用模板类。
        例如

        template<class T> struct A
        {
           A() { ++s_var; }
           static int s_var;
        };
        
        template<class T> int A<T>::s_var;
        
        stuct B :A<B> {
          B() { ++s_var; }  // this is a different s_var than the one used by 'C' below
        };
        
        struct C : A<C> {
          C() { ++s_var; } // this is a different s_var than the one used by 'B'
        };
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-05
          • 2019-02-13
          • 2011-07-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多