Как вы объявляете массивы в заголовке С++?
Это связано с некоторыми другими вопросами, такими как: этот и некоторые другие мои вопросы.
В этом и других вопросах мы видим, что можем объявить и инициализировать строковые массивы за один приятный шаг, например:
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
}
};
Но компилятор жалуется, и я не могу понять, почему. Можно ли объявить и инициализировать такой массив за один шаг в определении класса? Есть ли альтернативы, которые лучше?
Ответы
Ответ 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* []
не указывает, сколько места компилятор должен выделить для каждого экземпляра (ваш массив объявлен как переменная экземпляра).
Кроме того, вы, вероятно, захотите сделать этот массив статическим, поскольку он по существу является постоянным значением.