2011-01-27 3 views
4

한 번에 배열 구성원, 구성원을 초기화하고 모든 작동합니다 :C++ : 정적 내가 지금은 전역 범위에서이 작업을 수행 할 수 있습니다

const char* Foo::bars[3] = {"a", "b", "c"}; 

그러나이 훨씬 더 명확하고 자기 때문에 나는이 작업을 수행 할 수 문서화 (특히 열거 형을 색인으로 사용하는 경우) :

const char* Foo::bars[3]; 
bars[0] = "a"; 
bars[1] = "b"; 
bars[2] = "c"; 

어쨌든 가능합니까?

나는이 함수 (예를 들어, 클래스의 생성자) 안에서 할 수 있지만 프로그램의 시작 부분에서 생성자가 호출되지 않고 정적 배열을 사용하려는 경우 어떻게해야할까요? 그로 인해 문제가 발생합니다.

+2

왜 생성자를 호출해야합니까? – Simone

+0

OP는 Foo :: bars를 정적 멤버로 만들고 그 요소를 (메인이 실행되기 전에) 정적으로 초기화되도록합니다. –

+1

@Emile 예, OP의 첫 번째 코드 줄은 정확히 'bars'가 정적으로 선언 된 경우에 해당합니다. 생성자가 호출되므로 전체 토론의 요점을 놓치게됩니다. – Simone

답변

1

C++에는 static Java 블록과 동일한 기능이 없습니다.

당신이 정말로 자동으로 배열을 초기화하려면 작업 할 수있는 간단한 클래스를 만들 수 있습니다

// in .cpp 
class FooInitializer { 
public: 
    FooInitializer() { 
     Foo:bars[0] = "a"; 
     Foo:bars[1] = "b"; 
     Foo:bars[2] = "c"; 
    } 
}; 

static FooInitializer fooInitializer; 
당신은 접근 기능 사용할 수 있습니다
7

어때?

const char* Foo::bars[3] = { 
/* Index Value */ 
/* 0 */  "a", 
/* 1 */  "b", 
/* 2 */  "c" 
}; 

종종이 "기술"을 사용하여 구조체 배열의 초기화를 자체 문서화 스프레드 시트처럼 보이게 만듭니다.

+0

+1, 멋진 아이디어. :) –

+0

OP와 동일한 코드이므로 "생성자가 호출되지 않았습니다."는 작동하지 않습니다. 어쨌든 왜 부르면 안되는지 물어 보지마. – Simone

+0

@Simone : OP는 Foo :: bars를 정적 멤버로 만들고 프로그램을 실행하기 전에 초기화해야합니다. 그러나 OP는 초기화 구문을 좋아하지 않습니다. 예, 코드는 동일하지만 인라인 주석을 추가하여 배열 색인이 각 배열 요소에 표시되도록했습니다. 조잡하고, 그렇지만 효과적인 IMHO. –

0

: 여기

const char* GetArray() 
{ 
    static char* result[3]; 
    static isInitialized = false; 
    if (!isInitialized) 
    { 
     result[0] = "a"; 
     result[1] = "b"; 
     result[3] = "c"; 
     initialized=true; 
    } 
    return result; 
} 
+0

"a", "b"및 "c"리터럴에 로컬 범위가 있습니까? 나는 이것이 매다는 포인터를 초래할 수 있다고 생각한다. –

+0

약간의 연구를했습니다 ... 문자열 리터럴에는 실제로 전역 범위가 있습니다. –

+0

이 솔루션은 재진입 기능이 아니기 때문에 스레드로부터 안전하지 않습니다. –

0

다른 솔루션의를 Singleton 패턴을 사용합니다. 배열은 싱글 톤의 생성자에서 한 번 초기화됩니다. 또한 이것은 스레드로부터 안전하지 않습니다. 또한 싱글 톤의 악의에 유의하십시오 (이 문제에 대한 흥미로운 토론을 찾기 위해이 사이트에서 "싱글 톤"검색). 당신은을 사용하는 거라고하지만

#include <iostream> 

class StringTable 
{ 
public: 
    enum StringId 
    { 
     hello, 
     bye, 
     goodDay, 
     stringCount 
    }; 

    static const char* lookup(StringId id) {return instance().table_[id];} 

private: 
    StringTable() 
    { 
     table_[hello] = "Hello World!\n"; 
     table_[bye] = "Goobye, cruel world!\n"; 
     table_[goodDay] = "I said good day!\n"; 
    } 

    static StringTable& instance() 
    { 
     static StringTable theInstance; 
     return theInstance; 
    } 

    const char* table_[stringCount]; 
}; 


int main() 
{ 
    std::cout << StringTable::lookup(StringTable::hello) 
       << StringTable::lookup(StringTable::bye) 
       << StringTable::lookup(StringTable::goodDay); 
} 
0

당신은 아마, 바에서 추가 CONST이

const char* const Foo::bars[3] = 
{ 
    "a", 
    "b", 
    "c" 
}; 

당신이 그것을 선언하는 방법, 당신은 실제로 당신이 한 번에 회원에게 하나를 설정에서 원하는 것을 할 수 원하는 그것을하는 "init"함수.

원하는 경우 const를 원한다면 나중에 "init"메서드와 같이 한 번에 한 줄씩 할당하는 것이 불법이되며 코드 레이아웃을 사용하면됩니다. 당신이하고있는 일을 분명히합니다.

관련 문제