我有这些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
变量(这就是我想要的) ?
答案 0 :(得分:14)
整个程序中只有一个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
。
你可能还需要一个“Baser”基础来保留多态性,正如Neil和Akanksh指出的那样。
答案 1 :(得分:3)
只有一个,由所有三个班级共享。如果需要单独的实例,则必须在派生类中创建单独的函数。
答案 2 :(得分:3)
我很确定它将在A和B之间共享。
如果您想要自变量,可以使用“奇怪的重复模板模式”,如:
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<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 :(得分:2)
前者。本地静态变量绑定到包含它们的方法,并且method
存在于所有子类的一个化身中(实际上,对于整个应用程序,即使程序的其余部分没有看到该方法)。
答案 4 :(得分:1)
变量将被共享 - 它是每个函数 - 在这种情况下,它所属的函数是Base::method()
。但是,如果class Base
是一个模板类,您将获得class Base
模板的每个实例化(每个唯一的实际模板参数集)的变量的一个实例 - 每个实例化都是一个新函数。
答案 5 :(得分:1)
如果您将X设为静态,则它将在所有子类之间共享。该函数没有问题是静态的。