C ++ 헤더에서 어레이를 어떻게 선언합니까?
-
08-07-2019 - |
문제
이것은 다음과 같은 다른 질문과 관련이 있습니다. 이것, 그리고 내 다른 질문들 중 일부.
~ 안에 이 질문, 그리고 다른 사람들은 예를 들어 하나의 멋진 단계에서 문자열 배열을 선언하고 초기화 할 수 있습니다.
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
}
};
그러나 컴파일러는 불평하고 그 이유를 해결할 수없는 것 같습니다. 클래스 정의의 한 단계에서 이와 같은 배열을 선언하고 초기화 할 수 있습니까? 더 나은 대안이 있습니까?
해결책
키워드 정적 및 외부 초기화를 사용하여 배열을 클래스의 정적 멤버로 만드십시오.
헤더 파일에서 :
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"};
다른 팁
배열을 그렇게 선언 할 수없는 이유 (const char* [])는 다음과 같습니다.
- 클래스 선언에 이니셜 라이더를 가질 수 없으므로
- 구문
const char* []
컴파일러가 각 인스턴스에 할당 해야하는 공간을 명시하지 않습니다 (배열은 인스턴스 변수로 선언).
게다가, 당신은 아마도 배열을 정적으로 만들고 싶을 것입니다. 본질적으로 일정한 가치이기 때문입니다.
C ++에서는 불가능합니다. 배열을 직접 초기화 할 수 없습니다. 대신, 당신은 그것을 가지고있는 크기를 제공해야하며 (당신의 경우 4), dataprovider의 생성자에서 배열을 초기화해야합니다.
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);
}
};
배열을 직접 초기화 할 수 없으므로 배열에서 포인터의 구성을 포기해야합니다. 그러나 나중에 포인터를 올바른 값으로 설정해야하므로 포인터를 수정해야합니다.
그럼에도 불구하고 배열의 값이 const 인 경우, 유일한 방법은 정적 배열을 사용하는 것입니다.
/* 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" };
정적 배열을 갖는 것은 모든 객체가 해당 배열을 공유한다는 것을 의미합니다. 따라서 메모리도 저장했을 것입니다.