2010-01-20 14 views
3

클래스의 정적 변수로 tm struct를 사용하고 싶습니다.클래스의 정적 struct tm 초기화

static struct tm *dataTime; 
: 읽고하려고 하루 종일 지출하지만 여전히 누군가가 내가 공중에서, 내 수업에서 잘못

을하고 있었는지 지적 할 수 있다면 :(감사하겠습니다 작동하지 않을 수 있습니다, 내가로 선언 MAIN.CPP에서

, 나는 일시적으로 (런타임에 입력하는 실제 시간)

time_t rawTime; 
time (&rawTime); 
tm Indice::dataTime = localtime(&rawTime); 

을 테스트하기 위해 정의하고 시스템 시간을 초기화하는 것을 시도했다하지만 난 시간을 사용할 수 없습니다 등) (보인다 외부 기능.

main.cpp:28: error: expected constructor, destructor, or type conversion before ‘(’ token

클래스의 정적 tm에서 값을 초기화하는 방법은 무엇입니까?

+0

dataTime은'tm *'또는'tm'입니까? –

+0

'localtime'이 정적 인스턴스를 반환하기 때문에'tm *'이되지 않는 것이 좋습니다. –

답변

7

당신은 기능에 이상을 포장 할 수 있습니다

tm initTm() { 
    time_t rawTime; 
    ::time(&rawTime); 
    return *::localtime(&rawTime); 
} 

tm Indice::dataTime = initTm(); 

정적 기능을 만들거나 이름없는 네임 스페이스에 넣어 가능한 연결 문제를 방지하려면.

+2

+1 이름없는 네임 스페이스의 경우. (기침, 익명 성, 기침) – GManNickG

+1

감사합니다. 아마도 언젠가는 C++ 용어의 대부분을 암기 할 것입니다 ... –

+0

ㅎ, 너무 많습니다. 나는 바보 같고 익명이며 이름이 같지 않다는 것을 의미하지만 표준에 따르지는 않습니다. : | 어리석은위원회. – GManNickG

2

함수 외부에서 함수를 임의로 호출 할 수 없습니다. 어느 쪽이든 main() 함수에서 초기화하거나 초기화를 수행하는 생성자를 사용하여 tm 구조체 주위에 래퍼 클래스를 만듭니다.

4
struct tm get_current_localtime() { 
    time_t now = time(0); 
    return *localtime(&now); 
} 

struct tm Indice::dataTime = get_current_localtime(); 
2

랩 함수의 모든 일, 그리고 정적 멤버 초기화하는 것을 사용 struct

tm gettime() { 
    time_t rawTime; 
    time (&rawTime); 
    return localtime(&rawTime); 
} 

tm Indice::dataTime = gettime(); 

을 그리고 당신은 할 필요가 없습니다 (따라서는해야되지 않음) 접두사 구조체 사용 C++ : tm이면 충분하지 않으며, struct tm이 필요하지 않습니다.

1

또한 struct tm은 tm 구조체에 대한 포인터입니다. localtime으로부터의 리턴은 사용자 또는 다른 사람이 localtime을 다시 호출 할 때 내용이 변경되는 싱글 톤 포인터입니다.

+0

'localtime'은 정적 인스턴스를 반환합니다. 따라서 스레드로부터 안전하지 않거나 재진입 성이 아닙니다. 더 견고 함을 위해'localtime_r'도 있습니다. –

+0

내 대답은 내용을 바로 복사하여 약간 보상하지만 어떤 방법으로도 스레드로부터 안전하게 보호하지는 못합니다. –

+0

그 사실을 몰랐습니다. 업데이트되었습니다. 감사합니다. 그것은 얼마나 바보 같은 패턴입니다. –

0

이 추가 : 생성자 이니셜은() 한 다음 원하는대로 "글로벌"변수 dataTime을 설정하는

오브젝트 파일이 실행시에 초기화됩니다
namespace { 
    class Initializer { 
    public: 
     Initializer() { 
     time_t rawtime; time(&rawtime); 
     YourClass::dataTime = localtime(&rawtime); 
     } 
    }; 
    static Initializer myinit(); 
} 

라고합니다. 익명 네임 스페이스 구성은 Initializer 및 myinit 이름 충돌 가능성을 방지하는 데 도움이됩니다.

+0

이 메서드는 위에서 언급 한 함수를 사용하여 직접 초기화하는 것보다 이점이 있습니까? –