Статические переменные в статическом методе в базовом классе и наследовании - PullRequest
8 голосов
/ 29 апреля 2010

У меня есть эти классы C ++:

class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base
{

};

class B : public Base
{

};

Будет ли статическая переменная x использоваться совместно с A и B, или у каждой из них будет собственная независимая переменная x (что я и хочу)?

Ответы [ 6 ]

14 голосов
/ 29 апреля 2010

Во всей программе будет только один экземпляр x. Хорошим обходным решением является использование CRTP :

template <class Derived>
class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A> { };
class B : public Base<B> { };

Это создаст разные Base<T> и, следовательно, отдельные x для каждого класса, производного от него.

Вам также может понадобиться база «Басер», чтобы сохранить полиморфизм, как указывают Нейл и Аканш.

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

Я почти уверен, что он будет разделен между А и Б.

Если вам нужны независимые переменные, вы можете использовать «шаблон с любопытством повторяющихся шаблонов», например:

template<typename Derived>
class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A>
{

};

class B : public Base<B>
{

};

Конечно, если вы хотите полиморфизм, вам придется определить четный класс "Baser", из которого происходит Base, поскольку Base<A> отличается от Base<B>, например:

class Baser
{
};

template<typename Derived>
class Base : public Baser
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A>
{};

class B : public Base<B>
{};

Теперь A и B также могут быть полиморфными.

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

Будет только один, общий для всех трех классов. Если вам нужны отдельные экземпляры, вам придется создавать отдельные функции в производных классах.

2 голосов
/ 29 апреля 2010

бывший. Локальные статические переменные связаны с методом, содержащим их, и method существует в одном воплощении для всех подклассов (фактически, для всего приложения, даже если остальная часть программы не видит метод).

1 голос
/ 29 апреля 2010

Если вы делаете X статическим, он будет доступен всем дочерним классам. Нет проблем со статической функцией.

1 голос
/ 29 апреля 2010

Переменная будет разделена - она ​​для каждой функции - в этом случае функция, к которой она принадлежит, равна Base::method(). Однако если бы class Base был классом шаблона, вы бы получили один экземпляр переменной для каждого экземпляра (каждого уникального набора фактических параметров шаблона) шаблона class Base - каждый экземпляр является новой функцией.

...