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

Как объявить и инициализировать массив static const как член класса?

Довольно понятно. Массив имеет интегральный тип, содержимое известно и неизменено, а С++ 0x недопустимо. Он также должен быть объявлен как указатель. Я просто не могу найти синтаксис, который работает.

Объявление в Class.hpp:

static const unsigned char* Msg;

В классе Class.cpp действительно есть то, с чем я работал:

const unsigned char Class::Msg[2] = {0x00, 0x01}; // (type mismatch)
const unsigned char* Class::Msg = new unsigned char[]{0x00, 0x01}; // (no C++0x)

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

4b9b3361

Ответ 1

// in foo.h
class Foo {
    static const unsigned char* Msg;
};

// in foo.cpp
static const unsigned char Foo_Msg_data[] = {0x00,0x01};
const unsigned char* Foo::Msg = Foo_Msg_data;

Ответ 2

Вы смешиваете указатели и массивы. Если вам нужен массив, используйте массив:

struct test {
   static int data[10];        // array, not pointer!
};
int test::data[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

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

struct test {
   static int *data;
};
// cpp
static int* generate_data() {            // static here is "internal linkage"
   int * p = new int[10];
   for ( int i = 0; i < 10; ++i ) p[i] = 10*i;
   return p;
}
int *test::data = generate_data();