2012-12-16 2 views
1

나는 추상적 인 baseclass를 가지고 있는데, 이것은 몇몇 클래스들을 파생 시키는데 사용된다. 이 클래스의 일부 속성은 모든 클래스에서 공유되며 이러한 클래스는 수정할 수 없어야합니다.추상 baseclass에 정적 const 변수

변수를 10 개의 모든 클래스에서 공유하려면 정적으로 만듭니다.

class ABC{ 
public: 
    static int *anArray; 
    int index; 
    static int tot_index; 
    virtual void print()=0; 
    ABC(){index=tot_index++;}; 
    virtual ~ABC(){}; 
}; 

이 잘 작동, tot_index 인스턴스화 클래스의 수를 포함하고, 지수는 각 클래스의 유일한 ID입니다.

문제는 * anArray 및 파생 클래스 수가 런타임에 설정되고 클래스가 인스턴스화 된 후에이 값을 수정하지 않기를 바랍니다.

나는 abit를 당황 해요 : 나는 *이 anArray의 값을 설정해야합니다

1)? 파생 클래스의 무작위로 그냥?

2) 변수를 수정할 수 없으면 const로 설정해야합니다. 그러나 컴파일 타임에 값이 무엇인지 모르는 경우 const로 설정하는 방법은 무엇입니까?

+0

당신이 해결하려고하는 근본적인 문제가 무엇입니까? 이를위한 더 나은 디자인 패턴이있을 가능성이 있습니다. – Johnsyweb

+0

그리고 tot_index 상수를 정의하면 tot_index ++를 수행 할 수 없습니다. –

+1

정적 변수를 사용하면 문제가 발생합니다. C++에서는 static initialization order fiasco (SIOF)라고하는 불쾌한 점이 있습니다. 동료들이 말했듯이이 디자인은 좋지 않습니다. 달성하고자하는 것이 무엇인지 모르겠지만 기본 클래스의 인스턴스를 등록하는 것이 전부라면 별도의 객체를 사용하는 것이 좋습니다. 어쨌든 SIOF를 피하는 방법에 대한 C++ FAQ를 읽으십시오. – doc

답변

1

대신 정적 변수를 사용하면이를 달성 할 수있는 몇 가지 패턴이 있습니다.

구현하기 가장 쉬운 방법은 여러 가지 이유로 최선은 아니지만 공유 변수를 싱글 톤 기본 클래스 (GoF 싱글 톤 패턴 참조)에 넣는 것입니다.

GoF 추상 공장과 같이 좀 더 예민한 솔루션은 일부 공장 패턴이 될 수 있습니다.

편집 : 는 또한 문서의 주석을 참조하십시오 http://www.parashift.com/c++-faq/static-init-order-on-first-use.html

: