Подтвердить что ты не робот

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

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

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

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
    }

};

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

4b9b3361

Ответ 1

Используйте ключевое слово static и external initialization, чтобы сделать массив статическим членом класса:

В файле заголовка:

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

Ответ 2

Это невозможно в С++. Вы не можете напрямую инициализировать массив. Вместо этого вы должны указать его размер, который он будет иметь (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" };

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

Ответ 3

Причина, по которой вы не можете объявить свой массив (const char * []), такова:

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

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