如何在实例和静态范围之间创建成员变量?

时间:2013-01-28 14:00:45

标签: c++ instance static-members

我收到了一个新手C ++问题,抱歉这个......

在C ++中,如果我在基类中有实例变量,则所有派生实例都会获得自己的基本实例变量的个人副本。

现在,如果我有一个bass类的类变量(一个静态成员),那么所有派生的实例都可以共享基类'类变量。

我希望能够创建一个基本变量,该变量是根据派生类的实例实例化的,而不是由这些派生类的派生类实例实现的。

这可能吗?我该怎么办?或者做出这样的事情的最佳方法(解决方法)是什么?

所以给出一个(坏的)例子:

假设我有A类,它派生了B,C和D类。 我也有P类,它有派生类Q,R,S。

现在,我有一个Configurator类。它有许多依赖于Configurator类的实例变量的奇特函数。我喜欢A和P派生自Configurator类,它为A和P存储单独的配置。这样,B,C,D共享一个共同的配置,而Q,R,S共享它们自己的独立配置。

但是,Configurator类将为B,C,D和Q,R,S创建单独的配置实例,因为它的编写方式。

所以,无论如何,让Configurator类包含由派生类而不是每个实例实例化的成员变量会很好。

谢谢!

2 个答案:

答案 0 :(得分:2)

显而易见的方法是使用组合,而不是继承。这样,A和P中的每一个都有自己的静态配置,在各自的派生类之间共享。

class A {
  public: static Configurator config;
};
class P {
  public: static Configurator config;
};
class B : public A {};
class C : public A {};
class Q : public P {};
class R : public P {};

一种不太明显的方法是使用CRTP。

template <class Derived> class Configurator {
  public: static int configValue;
};
class A : public Configurator<A> {};
class B : public A {};
class P : public COnfigurator<P> {};
class Q : public P {};

答案 1 :(得分:1)

如果我理解正确,你想要一个在同一个类的所有实例中都是“静态”的变量,但是在不同的类之间变化,即使一个派生自另一个类。

解决方案是在基类上定义一个函数,该函数返回静态变量的值,如下所示:

class Base  {
    int &static_var() {
       static int myvar = 42;
       return myvar;
    }
};

class Derived: public Base {
    int &static_var() {
       static int myvar = 17;
       return myvar;
    }
};

这样你就应该:

Base b;
b.static_var(); // should be 42
Derived c;
c.static_var(); // should be 17