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