Член статической переменной наследования, но разделяет его отдельно для каждого вида класса наследования - PullRequest
4 голосов
/ 04 декабря 2011

Если класс наследует базовый класс со статической переменной-членом, будет их единственным членом, который совместно используется со всеми классами, которые наследуются.

У меня есть несколько видов, наследующих классы, и множество экземпляров каждого из них. Я хочу, чтобы у каждого из наследуемых классов был отдельный статический член, который используется всеми его экземплярами.

Как это можно сделать?

спасибо, и извините за мой плохой английский.

редактировать:

class a{
static int var;};
class b::a{};
class c::a{};

Теперь я хочу, чтобы все экземпляры b имели одинаковые var , и все экземпляры c имели бы одинаковые var , но var of b будет отличаться от var из c.

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

Ответы [ 3 ]

10 голосов
/ 04 декабря 2011

Вы можете работать, используя CRTP:

struct YourBaseBaseClass {
    // put everything that does not depend on your static variable
};

template <YourSubclass>
struct YourBaseClass : YourBaseBaseClass {
    static Member variable;
    // and everything that depend on that static variable.
};

struct AClass : YourBaseClass<AClass> {
     // there is a "variable" static variable here
};

struct AnotherClass : YourBaseClass<AnotherClass> {
     // which is different from the "variable" static variable here.
};

AClass и AnotherClass оба имеют статическую переменную variable (типа Member), но первая является статической.переменная от YourBaseClass<AClass>, а другая от YourBaseClass<AnotherClass>, которые являются двумя разными классами.

YourBaseBaseClass не является обязательным, но вам это нужно, если вы хотите манипулировать AClass и AnotherClass с помощьюYourBaseBaseClass* указатель (вы не можете иметь YourBaseClass* указатель, потому что YourBaseClass не является классом).

И не забудьте определить эти статические переменные.

2 голосов
/ 04 декабря 2011

Вы не можете поместить статический член в базовый класс в этом сценарии. Но вы можете попытаться поместить его в производный класс и получить к нему доступ, вызвав статический метод в базовом классе. Таким образом, экземпляры Derived и Derived2 могут использовать разные статические члены. И вы заставляете производный класс определять статический член с именем value, если вызывается его метод GetStaticValue ().

template <typename T>
class Base
{
public:

    static int GetStaticValue()
    {
        return T::value;
    }
};

class Derived : public Base<Derived>
{
    friend class Base<Derived>;
private:
    static int value;
};

int Derived::value = 1;

class Derived2 : public Base<Derived2>
{
    friend class Base<Derived2>;
private:
    static int value;
};

int Derived2::value = 2;

int main()
{
    Derived d;
    Derived da;
    int ret = d.GetStaticValue();
    ret = da.GetStaticValue();
    // As everything is static you don't need to instantiate the Derived classes
    ret = Base<Derived>::GetStaticValue(); 

    Derived2 d2;
    Derived2 d2a;
    ret = d2.GetStaticValue();
    ret = d2a.GetStaticValue();
}
0 голосов
/ 04 декабря 2011

Статические члены отличаются от нестатических. Статические члены называются переменными класса, в то время как нестатические члены называются переменными экземпляра. Это связано с тем, что нестатические члены принадлежат определенному объекту (экземпляру класса), а статические переменные являются общими.

Таким образом, статические члены не следуют одним и тем же правилам наследования и остаются собственностью класса, который их определяет.

...