1

我有一个新手 C++ 问题,对此感到抱歉...

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

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

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

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

所以举一个(坏的)例子:

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

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

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

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

谢谢!

4

2 回答 2

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 {};
于 2013-01-28T14:18:04.727 回答
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
于 2013-01-28T14:10:19.303 回答