2008-11-12 5 views
21

이것은 다른 질문과 관련이 있습니다 (예 : this).어떻게 C++ 헤더에 배열을 선언합니까?

this question에서

, 그리고 다른 사람, 우리는 예를 들어, 우리는 하나의 좋은 단계에서 문자열 배열을 선언하고 초기화 할 수 있습니다 참조 :

const char* const list[] = {"zip", "zam", "bam"}; //from other question 

이 더 귀찮게와 함수의 구현에 이루어지지 또는에서 할 수 있습니다 모든 범위 밖에있는 .cpp 파일의 본문 컴파일러가 불평 내가 작동하지 수,

class DataProvider : public SomethingElse 
{ 
    const char* const mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"}; 

public: 
    DataProvider(); 
    ~DataProvider(); 

    char* GetData() 
    { 
     int index = GetCurrentIndex(); //work out the index based on some other data 
     return mStringData[index]; //error checking and what have you omitted 
    } 

}; 

그러나 : 내가 원하는 무엇

은 내가 사용하고 클래스의 멤버,이 같은만큼이 같은 배열을 가지고있다 왜? 클래스 정의의 한 단계에서 이와 같은 배열을 선언하고 초기화 할 수 있습니까? 더 나은 대안이 있습니까?

나는 이것이 매우 아마추어적인 실수라고 확신하지만 항상 그렇듯이 귀하의 도움과 조언을 매우 소중하게 생각합니다.

건배

xan

+0

"도 구현이"철자해야한다 "구현" –

답변

18

배열 클래스의 정적 멤버 만들기 위해 키워드 정적 및 외부 초기화를 사용하여 헤더 파일에서

다음에

class DataProvider : public SomethingElse 
{ 
    static const char* const mStringData[]; 

public: 
    DataProvider(); 
    ~DataProvider(); 

    const char* const GetData() 
    { 
     int index = GetCurrentIndex(); //work out the index based on some other data 
     return mStringData[index]; //error checking and what have you omitted 
    } 

}; 

.CPP 파일 :

const char* const DataProvider::mStringData[] = {"Name1", "Name2", "Name3", ... "NameX"}; 
+0

배열에 헤더 선언에 크기를 제공해야합니다. – mbyrne215

+0

정말입니까? 그것은 나를 위해 잘 작동 (비주얼 C + + 2005) 그리고 나는 이전에 몇 번 그것을 사용하고 있습니다. 표준에서 정의되지 않은 동작이 아니라면 (지금은 보지 않을 것입니다) 작동한다고 믿습니다. –

+0

초기화 프로그램을 사용하는 동안 문제가 없습니다. 컴파일러는 초기화 프로그램의 항목 수를 기준으로 크기를 계산합니다. –

3

이는 C++에서 불가능하다. 배열을 직접 초기화 할 수는 없습니다. 대신에 당신은 그것을는 (귀하의 경우 4)해야합니다 크기를 제공해야하고, 당신은 DataProvider에의 생성자의 배열을 초기화 할 수 있습니다 : 당신이 CONST 다움을 포기해야

class DataProvider { 
    enum { SIZEOF_VALUES = 4 }; 
    const char * values[SIZEOF_VALUES]; 

    public: 
    DataProvider() { 
     const char * const v[SIZEOF_VALUES] = { 
      "one", "two", "three", "four" 
     }; 
     std::copy(v, v + SIZEOF_VALUES, values); 
    } 
}; 

주 왜냐하면 당신은 직접 배열을 초기화 할 수 없기 때문이다. 그러나 나중에 포인터를 올바른 값으로 설정해야하므로 포인터를 수정해야합니다. 정적 배열을 갖는 것은 모든 객체가 배열을 공유하는 것을 의미합니다

/* in the header file */ 
class DataProvider { 
    enum { SIZEOF_VALUES = 4 }; 
    static const char * const values[SIZEOF_VALUES]; 
}; 

/* in cpp file: */ 

const char * const DataProvider::values[SIZEOF_VALUES] = 
    { "one", "two", "three", "four" }; 

: 배열에 값이 그럼에도 불구하고 CONST 경우

는 유일한 방법은 정적 배열을 사용하는 것입니다. 그러므로 당신도 기억을 살릴 것입니다.

+1

_ 당신은 가능성이 단지 객체 지향 프로그래밍의 기본 원칙을 훼손했다 또한 의미 _ "정적 배열을 갖는 모든 객체가 배열을 공유하는 것을 의미합니다" . –

3

그 이유는 같은 배열을 선언 할 수 없습니다 (const를 문자 * [])이다 :

  • 당신은 클래스 선언의 이니셜을 가지고, 그래서
  • 구문 수 없습니다 const char* [] 컴파일러가 각 인스턴스 (인스턴스 변수로 선언 된 배열)에 얼마나 많은 공간을 할당해야하는지 명시하지 않습니다.

게다가이 배열은 본질적으로 상수이기 때문에이 배열을 정적으로 만들고 싶을 것입니다.

+0

사실,'const char * []'_does_는 각 인스턴스에 대해 컴파일러가 할당해야하는 공간의 양을 알려줍니다. 단지 메모리에 대한 포인터입니다. 이것은 정말로 정적 변수 선언에 정적 변수가 아닌 _why_ 정적 배열 선언입니다. 새로운 인스턴스가 생길 때마다 여분의 메모리 할당이 필요하며 이러한 종류의 프로세싱 오버 헤드는 전통적으로 생성자에서 명시 적으로 처리됩니다. – meustrus