我有一个带有常量静态变量 a 的基类 A。我需要 B 类的实例对静态变量 a 具有不同的值。如何实现这一点,最好使用静态初始化?
class A {
public:
static const int a;
};
const int A::a = 1;
class B : public A {
// ???
// How to set *a* to a value specific to instances of class B ?
};
我有一个带有常量静态变量 a 的基类 A。我需要 B 类的实例对静态变量 a 具有不同的值。如何实现这一点,最好使用静态初始化?
class A {
public:
static const int a;
};
const int A::a = 1;
class B : public A {
// ???
// How to set *a* to a value specific to instances of class B ?
};
你不能。所有派生类共享一个静态变量实例。
您可以使用Curiously recurring 模板模式来做到这一点(尽管您将不得不失去const
)。
template <typename T>
class A {
public:
static int a;
};
template <typename T>
int A<T>::a = 0;
class B : public A<B> {
struct helper { // change the value for A<B>::a
helper() { A<B>::a = 42; }
};
static helper h;
};
B::helper B::h;
静态成员在应用程序中是唯一的。您的系统中有一个A::a
常量。您可以做的是创建一个B::a
静态常量,B
其中将隐藏A::a
静态(如果您不使用完全限定名称:
class A {
public:
static const int a = 10;
};
static const int A::a;
class B : public A {
public:
static const int a = 20;
static void test();
};
static const int B::a;
void B::test() {
std::cout << a << std::endl; // 20: B::a hides A::a
std::cout << A::a << std::endl; // 10: fully qualified
}
也许我们可以尝试如下方式 :: 下面的好处是您不必多次编写代码,但实际生成的代码可能很大。
#include <iostream>
using namespace std;
template <int t>
class Fighters {
protected :
static const double Fattack;
double Fhealth;
static const double Fdamage;
static int count;
public :
Fighters(double Fh) : Fhealth(Fh) { }
void FighterAttacked(double damage) {
Fhealth -= damage;
}
double getHealth()
{
return Fhealth;
}
static int getCount()
{
//cout << count << endl;
return count;
}
};
const double Fighters<1>::Fdamage = 200.0f;
const double Fighters<1>::Fattack = 0.6f;
int Fighters<1>::count = 0;
class Humans : public Fighters<1> {
public :
Humans(double Fh = 250) : Fighters<1>(Fh) { count++; }
};
const double Fighters<2>::Fdamage = 40.0f;
const double Fighters<2>::Fattack = 0.4f;
int Fighters<2>::count = 0;
class Skeletons : public Fighters<2> {
public :
Skeletons(double Fh = 50) : Fighters<2>(Fh) { count++; }
};
int main()
{
Humans h[100];
Skeletons s[300];
cout << Humans::getCount() << endl;
cout << Skeletons::getCount() << endl;
return 0;
}
这是我的其他代码示例的一部分.. 不介意许多其他数据,但可以看到概念。