2011-12-04 8 views
4

クラスが静的変数メンバーで基本クラスを継承する場合、継承を持つすべてのクラスと共有する唯一のメンバーになります。継承静的変数メンバーですが、継承クラスのすべての種類に別々に共有します

私は、いくつかの継承クラスを持ち、それらのすべてのインスタンスを多く持っています。 私は、すべての継承クラスに、そのインスタンスすべてと共有される別々の静的メンバーを持たせたいと思います。

どうすればできますか?

ありがとう、貧しい私の英語についてはごめんね。

編集:

class a{ 
static int var;}; 
class b::a{}; 
class c::a{}; 

さて、私はBのすべてのインスタンスが同じVARを持っていることを望む、とCのすべてのインスタンスが同じVARを持っていますが、BのVARがされますcのののvarとは異なります。

私の英語についてもう一度申し訳ありませんが、あなたが私を正すことができるなら、それをしてください。

+0

すべてのインスタンスで共有される個別の静的メンバー。あなたは自分自身と矛盾しています。 – FailedDev

+0

私の編集 – yoni

+0

をご覧ください。@ BatchyXの答えをチェックしてください。それは死んで:) :) – FailedDev

答えて

10

あなたはCRTP使用していることをaroudを作業することができます:

struct YourBaseBaseClass { 
    // put everything that does not depend on your static variable 
}; 

template <YourSubclass> 
struct YourBaseClass : YourBaseBaseClass { 
    static Member variable; 
    // and everything that depend on that static variable. 
}; 

struct AClass : YourBaseClass<AClass> { 
    // there is a "variable" static variable here 
}; 

struct AnotherClass : YourBaseClass<AnotherClass> { 
    // which is different from the "variable" static variable here. 
}; 

AClassAnotherClass両方が(タイプMemberの)variable静的変数を持っていますが、最初のものはYourBaseClass<AClass>から静的変数であり、他方はYourBaseClass<AnotherClass>からですこれは2つの異なるクラスです。

YourBaseBaseClassはオプションですが、あなたは(YourBaseClassはクラスではありませんので、あなたが、YourBaseClass*ポインタを持つことはできません)YourBaseBaseClass*ポインタを使用してAClassAnotherClassを操作したい場合は、それを必要とします。

これらの静的変数は忘れずに定義してください。

+0

優れた提案。+1 – FailedDev

+0

+1ですが、継承やメソッドが含まれている場合は常に、構造体の代わりにクラスを使用します。 YourBaseBaseClassに(空の?)仮想デストラクタを追加することも重要です。 – smerlin

+0

非常に良い。ありがとうBatchyX。私はまだもっと簡単な解決策があることを願っています。 – yoni

0

スタティックメンバーは非スタティックメンバーとは異なります。静的メンバーはクラス変数と呼ばれ、非静的メンバーはインスタンス変数と呼ばれます。これは、非静的メンバーは特定のオブジェクト(クラスのインスタンス)に属し、静的変数は共有されるためです。

したがって、静的メンバーは継承の同じルールに従わず、それらを定義するクラスのプロパティのままです。

+0

だから私は、Aがベースであり、Bが派生した場合、 "A ::メンバー"によってBメソッドから静的メンバーにアクセスできることを追加する必要がありますね –

+0

@ user983064これは私の質問ではありませんでした。私の編集を参照してください、多分もっと明瞭です。 – yoni

2

このシナリオでは、基本クラスに静的メンバーを配置することはできません。しかし、それを派生クラスに入れて、基本クラスの静的メソッドを呼び出すことでアクセスできます。したがってDerivedとDerived2のインスタンスは、異なる静的メンバーを共有できます。 GetStaticValue()メソッドが呼び出された場合、派生クラスに値という名前の静的メンバーを定義させます。

template <typename T> 
class Base 
{ 
public: 

    static int GetStaticValue() 
    { 
     return T::value; 
    } 
}; 

class Derived : public Base<Derived> 
{ 
    friend class Base<Derived>; 
private: 
    static int value; 
}; 

int Derived::value = 1; 

class Derived2 : public Base<Derived2> 
{ 
    friend class Base<Derived2>; 
private: 
    static int value; 
}; 

int Derived2::value = 2; 

int main() 
{ 
    Derived d; 
    Derived da; 
    int ret = d.GetStaticValue(); 
    ret = da.GetStaticValue(); 
    // As everything is static you don't need to instantiate the Derived classes 
    ret = Base<Derived>::GetStaticValue(); 

    Derived2 d2; 
    Derived2 d2a; 
    ret = d2.GetStaticValue(); 
    ret = d2a.GetStaticValue(); 
} 
関連する問題