1

初心者のC++の質問がありましたが、これについては申し訳ありません...

C ++では、基本クラスにインスタンス変数がある場合、すべての派生インスタンスは、基本インスタンス変数の独自の個人用コピーを取得します。

ここで、bassクラス(静的メンバー)のクラス変数がある場合、すべての派生インスタンスは基本のクラス変数を共有できます。

派生クラスのインスタンスごとにインスタンス化されるが、これらの派生クラスの派生クラスのインスタンスによってインスタンス化されない基本変数を作成できるようにしたいと思います。

これは可能ですか?どうすればいいですか?または、そのようなことを行うための最良の方法(回避策)は何ですか?

したがって、(悪い)例を挙げます:

クラスAがあり、クラスB、C、およびDが派生しているとします。クラスPもあり、クラスQ、R、Sが派生しているとします。

今、私はConfiguratorクラスを持っています。そしてそれはConfiguratorクラスのインスタンス変数に依存する多くの素晴らしい機能を持っています。私はAとPがConfiguratorクラスから派生するのが好きです。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 に答える