【问题标题】:How to create a member variable between instance and static scope?如何在实例和静态范围之间创建成员变量?
【发布时间】:2013-01-28 22:41:57
【问题描述】:

我有一个新手 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 类包含由派生类而不是每个实例实例化的成员变量会很好。

谢谢!

【问题讨论】:

    标签: c++ instance static-members


    【解决方案1】:

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

    【讨论】:

    • 是的,没错。这是一个解决方案就是组合的问题。
    • 谢谢!我真的很喜欢这个 CRTP 解决方案,所以我会研究它。作文也很好,但我本来应该写我的选择是有限的。我必须改进现有系统的行为,而且我不能过多地改变现有的类。但 CRTP 看起来是可行的方法。
    【解决方案2】:

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

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

    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
    

    【讨论】:

    • 好的,也感谢您提供此选项。我将考虑在现有代码系统上改进新行为的不同方法。这也可能是一种可能的前进方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2018-04-02
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多