在超类中使用子类的静态变量
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++;}
从 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;
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++;}
从 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;