2010-11-04 7 views
0

Можно ли инициализировать статический константный пустой массив, пожалуйста, смотрите ниже код,Инициализировать статический константный пустой массив

//CFoo.h 
class CFoo 
{ 
public: 
    CFoo(); 
    ~CFoo(); 

public: 
    static const int arr[]; 

}; 

//CFoo.cpp 
const int arr[] = {0,1,2}; 

CFoo::CFoo(){} 
CFoo::~CFoo(){} 

EDIT:

Кажется код действителен, и Последующие вопросы, почему я не могу SIZEOF статический константный массив, как,

sizeof(CFoo::arr); 

есть ли способ я могу SizeOf CFoo :: обр?

Спасибо.

ответ

5

Да; вам нужно квалифицировать имя массива:

const int CFoo::arr[] = {0,1,2}; 

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

struct CFoo { 
    static const int arr[3]; 
}; 

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

+0

Спасибо, но можно ли использовать sizeof (CFoo :: arr)? Есть ли способ, которым я могу sizeof CFoo :: arr или найти его размер? – domlao

+0

Nasty, но для конкретных мест, где длинный список таких значений часто менялся, вы могли бы «#define VALUES {0, 1, 2} \ const int CFoo :: arr [] = VALUES; static const int check_cfoo_arr_size [] = VALUES; 'и static утверждают, что' sizeof CFoo :: arr == sizeof check_cfoo_arr_size' ... :-(. –

3

SizeOf не оценивается во время компиляции, а не связать время, так нет - вы не можете оставить его неопределенные в заголовке еще есть его оценивали перед определением.

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