如何在实例和静态作用域之间创建成员变量

How to create a member variable between instance and static scope?

本文关键字:之间 创建 成员 变量 作用域 静态 实例      更新时间:2023-10-16

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

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

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

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

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

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

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

现在,我有一个配置器类。 它有许多依赖于配置器类的实例变量的花哨函数。 我喜欢 A 和 P 从配置器类派生,该类存储了 A 和 P 的单独配置。 这样,B,C,D共享一个通用配置,而Q,R,S共享自己的独立配置。

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

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

谢谢!

显而易见的方法是使用组合,而不是继承。这样,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 {};
如果我

理解正确,你想要一个变量,它在同一类的所有实例中是"静态的",但即使一个是从另一个派生的,它在不同的类之间也有所不同。

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

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