在超类中使用子类的静态变量

using subclass's static variable in superclass

class Class1 {
Class1() { Class2::counter++;}
}

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

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

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

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

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

int Class2::counter = 0;

一条经验法则:基 classes 不访问子 class 成员或方法

如果基 class 需要子 class 的某些东西,则在基 class 中声明一个抽象虚函数供子实现。

或将公共数据成员或方法移动到基class。

你的情况:

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

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

class Class1 {
public:
    Class1();
};

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

int Class2::counter = 0;

Class1::Class1() { Class2::counter++;}

Live demo

从 OOP 的角度来看,父 class 无法访问子字段或 属性,这应该与子访问父字段或 属性 的方式相反.我想知道为什么您需要从父级访问子字段?如果您提供更多详细信息,您将尝试实现最佳解决方案。

在Class2的定义之后简单地定义classClass1的构造函数

class Class1 {
public:
Class1();
}

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

Class1::Class1() { Class2::counter++;}

不要忘记定义 Class2 的静态数据成员。:)

如果您想对模板进行疯狂的尝试,这听起来可能是 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;