문제

이것은 다음과 같은 다른 질문과 관련이 있습니다. 이것, 그리고 내 다른 질문들 중 일부.

~ 안에 이 질문, 그리고 다른 사람들은 예를 들어 하나의 멋진 단계에서 문자열 배열을 선언하고 초기화 할 수 있습니다.

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" };

정적 배열을 갖는 것은 모든 객체가 해당 배열을 공유한다는 것을 의미합니다. 따라서 메모리도 저장했을 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top