2011-12-04 2 views
4

클래스가 정적 변수 member를 사용하여 기본 클래스를 상속하는 경우 상속 관계에있는 모든 클래스와 공유하는 유일한 멤버입니다.상속 정적 변수 member. 상속 클래스의 모든 종류와 별도로 공유합니다.

클래스를 상속하는 클래스가 거의없고, 모든 인스턴스가 여러 개 있습니다. 상속 클래스의 모든 인스턴스에는 인스턴스가 모두 공유되는 별도의 정적 멤버가 있어야합니다.

어떻게 할 수 있습니까?

감사합니다. 불쌍한 영어에 대해 사과드립니다.

편집 : 이제

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

, 나는 B의 모든 인스턴스가 같은 VAR있을 것이라는 점을 원하고, C의 모든 인스턴스가 같은 VAR이되지만, VAR B의이 될 것입니다 c의 var과 다릅니다.

영어로 다시 미안합니다. 제게 고칠 수 있으면 제발 해주세요.

+0

모든 인스턴스와 공유되는 분리 정적 멤버. 당신은 자신을 모순됩니다. – FailedDev

+0

내 편집 – yoni

+0

@ BatchyX의 답변을 확인하십시오. 그것은 죽었어 :)에 – FailedDev

답변

10

당신은 CRTP 사용하는 것을 아루를 해결할 수 있습니다

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>에서입니다 두 개의 다른 클래스입니다.

YourBaseBaseClass은 선택 사항이지만 (YourBaseClass 클래스가 아니기 때문에 당신이하는 YourBaseClass* 포인터를 가질 수 없습니다)을 YourBaseBaseClass* 포인터를 사용 AClassAnotherClass을 조작하려는 경우 당신은 그것을 필요합니다.

그리고 이러한 정적 변수를 정의해야합니다.

+0

우수 제안.+1 – FailedDev

+0

+1하지만 일반적인 방법은 상속 또는 메소드가있을 때마다 구조체 대신 클래스를 사용하는 것입니다. YourBaseBaseClass에 (비어있는?) 가상 소멸자를 추가하는 것도 중요합니다. – smerlin

+0

아주 좋네요. 감사합니다 BatchyX. 나는 여전히 더 간단한 해결책이 있기를 희망한다. – yoni

0

정적 멤버는 비 정적 멤버와 다릅니다. 정적 멤버는 클래스 변수라고하며, 비 정적 멤버는 인스턴스 변수라고합니다. 이는 정적 변수가 공유되는 동안 비 정적 구성원이 특정 객체 (클래스의 인스턴스)에 속하기 때문입니다.

따라서 정적 멤버는 동일한 상속 규칙을 따르지 않으며 정의 된 클래스의 속성으로 유지됩니다.

+0

그래서 나는 A가 기본이고 B가 파생되면, "A :: member"에 의해 B 메서드에서 정적 멤버에 액세스 할 수 있다고 덧붙여 야한다고 생각한다. –

+0

@ user983064 이것은 내 질문이 아니었다. 제 편집문을 보시고, 아마도 더 분명하게 보입니다. – yoni

2

이 시나리오에서는 기본 클래스에 정적 멤버를 넣을 수 없습니다. 하지만 파생 클래스에 넣고 기본 클래스에서 정적 메서드를 호출하여 액세스 할 수 있습니다. 따라서 파생 클래스와 파생 클래스 2의 인스턴스는 서로 다른 정적 멤버를 공유 할 수 있습니다. GetStaticValue() 메서드가 호출되면 파생 클래스가 value라는 정적 멤버를 정의하도록합니다.

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(); 
}