C ++: Инициализация постоянной статической переменной базового класса с другим значением в производном классе? - PullRequest
5 голосов
/ 21 апреля 2010

У меня есть базовый класс 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 ?
};

Ответы [ 4 ]

8 голосов
/ 21 апреля 2010

Вы не можете. Существует один экземпляр статической переменной, который используется всеми производными классами.

3 голосов
/ 21 апреля 2010

Вы можете сделать это с Любопытно повторяющимся шаблоном (хотя вам придется потерять 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;
3 голосов
/ 21 апреля 2010

Статические члены уникальны в приложении. В вашей системе есть единственная константа 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
}
0 голосов
/ 18 июня 2016

Может быть, мы можем попробовать так, как показано ниже: Преимущество приведенного ниже состоит в том, что вам не нужно писать код несколько раз, но фактически сгенерированный код может быть большим.

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

Это часть моего другого примера кода ... не возражаю против многих других данных, но можно увидеть концепцию.

...