9

私はこれらのC++クラスを持っています:

class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base
{

};

class B : public Base
{

};

x静的変数はとの間で共有されますAか、Bそれともそれぞれが独自の独立x変数を持っていますか(これは私が欲しいものです)?

4

6 に答える 6

14

xプログラム全体でのインスタンスは1つだけです。良い回避策は、 CRTPを使用することです。

template <class Derived>
class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A> { };
class B : public Base<B> { };

これにより、派生するクラスごとに異なるBase<T>、したがって個別のが作成されます。x

NeilとAkankshが指摘しているように、ポリモーフィズムを保持するために「Baser」ベースが必要になる場合もあります。

于 2010-04-29T11:54:50.670 に答える
3

AとBの間で共有されると確信しています。

独立変数が必要な場合は、次のような「不思議なことに繰り返されるテンプレートパターン」を使用できます。

template<typename Derived>
class Base
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A>
{

};

class B : public Base<B>
{

};

もちろん、ポリモーフィズムが必要な場合は、次のようなものBase<A>とは異なり、Baseが派生する「Baser」クラスを定義する必要があります。Base<B>

class Baser
{
};

template<typename Derived>
class Base : public Baser
{
protected:
    static int method()
    {
        static int x = 0;
        return x++;
    }
};

class A : public Base<A>
{};

class B : public Base<B>
{};

これで、AとBも多型になります。

于 2010-04-29T11:58:45.630 に答える
3

3つのクラスすべてで共有されるのは1つだけです。個別のインスタンスが必要な場合は、派生クラスに個別の関数を作成する必要があります。

于 2010-04-29T11:55:03.547 に答える
2

前者。ローカル静的変数は、それらを含むメソッドにバインドされ、methodすべてのサブクラスに対して1つのインカネーションに存在します(実際、プログラムの残りの部分がメソッドを認識していなくても、アプリ全体に対して)。

于 2010-04-29T11:55:24.107 に答える
1

Xを静的にする場合は、すべての子クラス間で共有されます。関数が静的であることに問題はありません。

于 2010-04-29T11:57:49.720 に答える
1

変数は共有されます-それは関数ごとです-この場合、それが属する関数はですBase::method()。ただしclass Base、テンプレートクラスの場合、テンプレートのインスタンス化(実際のテンプレートパラメータの一意のセットごと)ごとに変数のインスタンスを1つ取得しますclass Base。各インスタンス化は新しい関数です。

于 2010-04-29T11:56:22.180 に答える