Как вы объявляете массивы в заголовке c ++? - PullRequest
22 голосов
/ 12 ноября 2008

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

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

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
    }

};

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

Я уверен, что это очень любительская ошибка, но, как всегда, ваша помощь и совет очень ценятся.

Приветствия

1021 * Xan *

Ответы [ 3 ]

18 голосов
/ 12 ноября 2008

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

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

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"};
3 голосов
/ 12 ноября 2008

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

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

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

3 голосов
/ 12 ноября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...