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

时间:2015-05-28 21:52:42

标签: c++ variables static subclass

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

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

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

6 个答案:

答案 0 :(得分:2)

从OOP的角度来看,父类无法访问子字段或属性,它应该与子进程访问父字段或属性相反。我想知道你需要从父母那里访问tora child field吗?如果您提供更多详细信息,那么您将尝试实现最佳解决方案。

答案 1 :(得分:1)

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

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

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

int Class2::counter = 0;

答案 2 :(得分:0)

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

如果基类需要来自子类的内容,则在基类中声明一个抽象虚函数以供子实现。

或者将公共数据成员或方法移动到基类中。

在你的情况下:

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

答案 3 :(得分:0)

您可以在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 :(得分:0)

在Class2的定义之后,只需定义类Class1的构造函数。

class Class1 {
public:
Class1();
}

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

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

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

答案 5 :(得分:0)

如果你想让模板变得怪异,这听起来可能会用于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;