【问题标题】:using subclass's static variable in superclass在超类中使用子类的静态变量
【发布时间】:2015-05-28 21:52:41
【问题描述】:
class Class1 {
Class1() { Class2::counter++;}
}

class Class2: public Class1 {
public:
static int counter;
}

以上是我正在尝试做的一个例子。我试图在超类中使用子类的静态变量,但这给了我一个编译器错误,因为首先初始化 Class1 并且当编译器到达 Class2::counter++;它尚未初始化 Class2,因此我收到“Class2 尚未声明”错误。我怎样才能解决这个问题?我需要完全改变我的逻辑吗?

【问题讨论】:

    标签: c++ variables static subclass


    【解决方案1】:

    从 OOP 的角度来看,父类不能访问子字段或属性,它应该以相反的方式访问父字段或属性的子类。我想知道为什么你需要从父母那里访问 tora 子字段?如果您提供更多详细信息,您正在努力实现的最佳解决方案将由某人提供。

    【讨论】:

      【解决方案2】:

      您可以将计数器的引用传递给基类:

      class Class1 {
      public:
          Class1(int& counter) { ++counter; }
      };
      
      class Class2: public Class1 {
      public:
          static int counter;
          Class2() : Class1(counter) { }
      };
      
      int Class2::counter = 0;
      

      【讨论】:

        【解决方案3】:

        您可以将构造函数Class1 的定义放在Class2 定义之后:

        class Class1 {
        public:
            Class1();
        };
        
        class Class2: public Class1 {
        public:
            static int counter;
        };
        
        int Class2::counter = 0;
        
        Class1::Class1() { Class2::counter++;}
        

        Live demo

        【讨论】:

        • 我想我会选择这个,因为它需要对我的代码进行最少的更改
        【解决方案4】:

        经验法则:基类不访问子类成员或方法

        如果基类需要来自子类的东西,请在基类中声明一个抽象虚函数供子类实现。

        或者将常用的数据成员或方法移到基类中。

        在你的情况下:

        class Base
        {
          virtual void increment_counter(void) = 0;
          void my_method(void)
          {
            increment_counter();
          }
        };
        
        class Child : public Base
        {
          int counter;
          void increment_counter(void)
          {
            ++counter;
          }
        };
        

        【讨论】:

          【解决方案5】:

          在Class2的定义之后,简单的定义Class1的构造函数。

          class Class1 {
          public:
          Class1();
          }
          
          class Class2: public Class1 {
          public:
          static int counter;
          }
          
          Class1::Class1() { Class2::counter++;}
          

          别忘了定义 Class2 的静态数据成员。:)

          【讨论】:

            【解决方案6】:

            如果您想使用模板变得怪异,这听起来可能是 curiously recurring template pattern 的用途。例如:

            template <typename T>
            class CRTBase
            {
                CRTBase() { T::counter++; }
            };
            
            class CRTDerived : public CRTBase<CRTDerived>
            {
            public:
                static int counter;
            };
            
            int CRTDerived::counter = 0;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-02-05
              • 2015-04-23
              • 2016-03-27
              • 2015-02-03
              • 1970-01-01
              相关资源
              最近更新 更多