2008-11-12 9 views
21

Это связано с некоторыми другими вопросами, такими как: this и некоторыми другими моими вопросами.Как вы объявляете массивы в заголовке C++?

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

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 
    } 

}; 

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

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

Приветствия,

Xan

+0

«implimentation» должен быть прописан «реализация» – 2008-11-13 10:22:43

ответ

18

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

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

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

Вам нужно указать массив в объявлении заголовка. – mbyrne215 2008-11-12 18:31:17

3

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

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

+1

_ «Имея статический массив означает, что все объекты будут делить этот массив» _ Что также означает, что вы, вероятно, просто скомпрометированы основополагающие принципы объектно-ориентированное программирование , – 2013-12-05 07:47:11

3

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

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

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

+0

На самом деле, `const char * []` _does_ указать, сколько места компилятор должен выделить для каждого экземпляра - просто указатель на память. Это действительно _why_ статическое объявление массива не допускается для нестатических переменных; каждый новый экземпляр требует дополнительного распределения памяти, и этот вид служебных данных обработки традиционно обрабатывается явно в конструкторах. – meustrus 2012-10-02 20:47:15

Смежные вопросы