Как Вы объявляете массивы в заголовке C++?

Это связано с некоторыми другими вопросами, такими как: это и некоторые мои другие вопросы.

В этом вопросе и других, мы видим, что можем объявить и инициализировать массивы строк на одном хорошем шаге, например:

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
    }

};

Но, компилятор жалуется, и я, может казаться, не удаюсь почему. Действительно ли возможно объявить и инициализировать массив как это за один шаг в определении класса? Есть ли альтернативы, которые лучше?

22
задан halfer 6 July 2019 в 00:05
поделиться

3 ответа

Используйте ключевое слово статическая и внешняя инициализация для создания массива статическим членом класса:

В заголовочном файле:

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"};
18
ответ дан Stefan Rådström 29 November 2019 в 05:33
поделиться

Причина Вы не можете объявить свой массив как этот (символ константы* []) состоит в том что:

  • у Вас не может быть инициализаторов в объявлении класса, и таким образом
  • синтаксис const char* [] не указывает, сколько места компилятор должен выделить для каждого экземпляра (Ваш массив объявляется как переменная экземпляра).

Кроме того, Вы, вероятно, хотите сделать тот массив статичным, так как это - в сущности постоянная величина.

3
ответ дан Carl Seleborg 29 November 2019 в 05:33
поделиться

Это не возможно в 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);
    }
};

Примечание, что необходимо разочароваться в мысе константы указателей в массиве, так как Вы не можете непосредственно инициализировать массив. Но необходимо позже установить указатели на правильные значения, и таким образом указатели должны быть модифицируемыми.

, Если Ваши значения в массиве являются константой, тем не менее, единственный путь состоит в том, чтобы использовать статический массив:

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

Наличие статического массива означает, что все объекты совместно используют тот массив. Таким образом Вы сохраните память также.

3
ответ дан Johannes Schaub - litb 29 November 2019 в 05:33
поделиться