2009-12-04 3 views
3

main()을 입력하기 전에 내 C++ 클래스가 인스턴스화되지 않도록하고 싶습니다. 이것을 달성 할 수있는 방법이 있습니까?main()보다 먼저 클래스를 인스턴스화하지 못하도록 보호

-

일부 설명 :

내가 임베디드 응용 프로그램을 쓰고 있어요. 내 클래스는 정적 (BSS에 있어야 함)이어야하지만 인스턴스화시 main()이 시작될 때 특정 작업이 초기화되기 전에 사용할 수없는 리소스가 필요합니다. 그래서 마이어스 싱글 톤으로 만들고 싶습니다. 이상 적으로 MyClass :: instance()가 main() 전에 호출되지 않도록 보장하는 assert를 만들고 싶습니다.

+0

는 클래스 (글로벌 생략) .. 나 메인 함수로 그 제어 개시를 알고 사용 ?? 주 전에 인스턴스화 될 수있다 .. 정적 기억 영역은 정적 키워드를 사용하여 클래스에 할당 될 수있다. – sud03r

+1

예, _is_ global 인 다른 클래스에서 간접적으로 할 수 있습니다. 예 : 'Bar :: Bar() {정적 Foo notGlobal; }'- Bar 타입의 전역 변수가있는 경우 그 Foo 객체는 전역 바의 일부로 구성됩니다. – MSalters

+1

아, 그리고 수정 사항은 main()에서가 아니라 자신의 Meyers 싱글 톤에서 "그 것들"을 초기화하는 것입니다. 물론 argv []에 의존하지 않는 한. – MSalters

답변

2

한 가지 : 난 그냥 짧은 코드를 좋아한다, 위의 구현을 단순화 할 수있다. 이 플래그가 false의 경우에 ctor가 불려 가면 (자), 예외가 슬로우됩니다. 이렇게하면 누군가가 규칙을 어기는 것을 런타임에 알 수 있습니다. 당신이 정적 플래그의 초기화에주의해야

알 수 있습니다. 건설 오더 문제를 피하려면 처음 액세스 할 때 초기화되는 싱글 톤으로 만드는 것이 가장 좋습니다.

7

일부 메서드가 호출되기 전에 클래스의 생성을 제한하는 것은 잃는 싸움이 될 것입니다. 특히 그 방법이 main() 인 경우. 이 요구 사항이 필요한 이유를 묻습니다. 아마도 당신이 해결하려고 시도하고있는 실제 문제를 해결할 다른 방법이있을 것입니다.

편집 : CTQ를 주셔서 감사 드리며 가장 좋은 방법은 아마도 정적 부울 인 가장 간단한 해결책 일 것입니다. 그것이 임베디드 된 이후로 저는 여러분이 전체 환경을 거의 제어한다는 가정을 할 것입니다. 정적 bool 기반의 ::instance()에있는 간단한 어설 션은 아마도 필요한 것일 것입니다.

한 걸음 더 나아가서, 의존성 주입이나 자원이 올바른 순서로 초기화된다는 것을 확신 할 수있는 것 같습니다. 솔직히 말하자면, 저는 C++에서 다루지 않은 문제는 아닙니다. (임베디드 시스템에서 보자). 나는 그 사건에 대한 가장 효과적인 수단에 대한 추가적인 통찰력을 줄 수 없으며이 질문에 대한 다른 대답 중 하나를 고려해 볼 것을 제안합니다.

+0

글쎄, 난 임베디드 응용 프로그램을 쓰고 있어요. 내 클래스는 정적 (BSS에 있어야 함)이어야하지만 인스턴스화시 main()이 시작될 때 특정 작업이 초기화되기 전에 사용할 수없는 리소스가 필요합니다. 그래서 마이어스 싱글 톤으로 만들고 싶습니다. 이상적으로 main() 전에 MyClass :: instance()가 호출되지 않도록 보장하는 어설 션을 만들고 싶습니다. –

0

깨끗한 방법이 없습니다. 아마도이 목표를 달성하기 위해 할 수있는 일이있을 수 있지만, 이 아닙니다.

완전한 필요성을 설명하고 더 나은 해결책을 찾을 수있을 것이라고 확신합니다.

2

클래스 첫 번째 인스턴스에 대해 설정되는 정적 부울을주고, 그것을 멈추지 않을 것입니다 생성자 비공개로 공장을 사용하거나 만드는 주()

의 시작 부분에 그것을 확인은 생성자에서 인스턴스화하는 것을 main()보다 먼저 인스턴스화되는 클래스

-1

가능한 한 가지 방법은 main 클래스 내부에 클래스를 인스턴스화하는 것입니다. 즉

MyClass * g_thing = 0; 
int main() 
{ 
    g_thing = new MyClass(); 
} 

외에도 까다로운 컴파일러 관련 혼란이 있습니다. 무엇을 성취하려고합니까?

+3

이것은 질문 된 질문과는 아무런 관련이 없습니다. – shoosh

+0

+1 오른쪽 대상 – EvilTeach

+0

이것은 다른 문제를 해결하면서 원하는 문제를 해결할 수있는 대안 방법이지만 완벽한 것은 없습니다. 나는 나 자신을 더 잘 설명해야 했음에도 나는 그 질문과 관련이 없다고 생각하지 않는다. –

0

) (주이 시작할 때 실행됩니다 코드를 제어 할 수있는 경우에, 당신은이 같은 기능을 할 수 있습니다 : 주 사용 wasMain (참) 내에서 다음

bool wasMain (bool inMain = false) { 
    static bool passedMain = false; 
    return passedMain |= inMain; 
} 

, 첫 번째 줄과 반환된다 그 시점부터는 true를 리턴합니다.

편집 : 당신은 클래스의 정적 플래그집니다 MyClass::enableConstruction() 같은 정적 메서드를 가지고있다 할 수

bool wasMain (bool inMain = false) { 
    static bool passedMain = false; 
    if (inMain) 
    passedMain = true; 
    return passedMain; 
} 
관련 문제