2013-05-28 2 views
2
내 전역 개체는 각각의 생성자를 호출하지 않고 생성

어떻게 든 :글로벌 객체 생성자가 호출 받고되지

static int num = 0; 
class TestClass 
{ 
public: 
    int a; 
    float b; 
    TestClass(float f) 
    { 
     a = 55; 
     b = f; 
     ++num; 
    } 
}; 
TestClass test(32); 

int main(int argc,char *argv[]) 
{ 
    std::cout<<"Int: "<<test.a<<std::endl; 
    std::cout<<"Float: "<<test.b<<std::endl; 
    std::cout<<"Constructor has been called "<<num<<" times"<<std::endl; 
    while(true); 
    return 0; 
} 

출력은 : 나는이 같은 생성자를 사용했습니다

Int: 0 
Float: 0 
Constructor has been called 0 times 

이전과는 다른 프로젝트 였고 이런 문제가 없었습니다. 매개 변수없는 생성자를 시도하고 테스트 변수를 정적으로 만들지 않았으며 다른 효과가 없었습니다. 누가이 일이 벌어지고 있는지 나에게 깨달을 수 있습니까?

차이점이있을 경우를 대비하여 Visual Studio 2010을 사용하고 있습니다.

+1

관심있는 사람이라면 [ideone] (http://ideone.com/3pnvDc)에서 잘 작동합니다. – Dukeling

+0

코드가 정확한 결과를 제공합니다. –

+5

정확한 코드인가요? 특히 동일한 파일에 전역'TestClass test'와'int num' 카운터가 있습니까? –

답변

2

나는 완전히 확실하지 않다하지만이 질문에 대답 수 있습니다

문서는 서로 다른 컴파일 단위에서 글로벌 생성자를 사용할 때 발생할 수있는 문제를 지적 : http://www.nsnam.org/docs/linker-problems.doc

편집 자세한 내용은를 추가하기를 . 예를 들어 동적으로 링크 된 일부 라이브러리에서 객체를 전역으로 정의하면이 라이브러리의 메소드에 액세스 할 때 해당 객체 생성자가 호출되지 않을 수 있습니다.

은 원래의 질문에서 예제를 사용하려면 다음과 main() 기능을 일부 실행 파일에있는 동안 클래스 TestClass 및 전역 객체 testTestLibrary.dll에있을 수 있습니다. TestLibrary.dll이로드되고 실행 파일에서 test 객체에 액세스하는 방법에 따라 라이브러리는 방금로드되었다는 정보를 결코 얻지 못하기 때문에 (또는 전역 적 초기화 함수가 호출되지 않았습니다.).

+2

Word가없는 사람들을 위해이 링크의 내용을 요약해서 보여줄 수 있습니까? –

+0

... 그리고 구체적으로 17 페이지 문서의 어느 부분이 문제를 해결합니다. 유용한 링크는 권장되지만 ** 답변 ** 대신 ** 주석 **을 사용하는 것이 좋습니다. ** ** 질문에 답변하고 ** "여기가 내가 찾은 곳"과 같은 방식을 사용하지 않는 이상 ** 링크를 포함해야합니다. – Dukeling

+0

네 말이 맞아. 죄송합니다. 이 답변을 더 유용하게 만들 수있는 정보를 추가했습니다. –

0

실행 파일에 연결하는 프로젝트를 실행 파일로 컴파일하면 Visual Studio에서 모든 것이 잘 연결되지만 전역 생성자는 호출되지 않습니다.

관련 문제