2015-03-26 4 views
2

Я хочу иметь статические переменные в классе C++ (если возможно, const). Как я могу установить их значение? Я хочу, чтобы они были динамически распределены.Статическая переменная C++ в классе

Вот мой класс:

class Color 
{ 
public: 
    static int* BLACK; 
    static int* WHITE; 
}; 

Я сделал это, что, кажется, работает нормально:

int* Color::BLACK = new int[3]; 
int* Color::WHITE = new int[3]; 

Но как установить их значение после этого? И возможно ли сделать их const?

+1

Зачем вам нужно их динамически распределять? И «устанавливая их значение», вы имеете в виду переопределить вновь выделенный массив или получить доступ к значениям массива? – crashmstr

+0

Цвет :: BLACK [0] = 0; (и т. д.) в начале main() или где-то, что приложение инициализировано? А const, вы имеете в виду int * const или int const * const? – qeadz

ответ

1

Возможно, лучше не выделять цвета, динамически выделяемые в первую очередь, поскольку это предотвратит возможность компилятора выполнять различные оптимизации. В идеале:

class Color 
{ 
public: 
    static int const BLACK[3]; 
}; 
int const Color::BLACK[3] = {0,0,0}; 

Однако, если вы хотите их в куче, то это зависит от того, хотите ли вы указатель быть константным, значение константным или оба!

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

class Color 
{ 
public: 
    static int const * const BLACK; 
}; 
int const * const Color::BLACK = new int[3]{0,0,0}; 

Чтобы быть честным, я не уверен, что контекст будет требовать указателя и выделения. Это кажется ненужным.

EDIT: Для пре-C++ 11 компиляторов вы могли бы сделать что-то вроде этого:

int * make_black() 
{ 
    int * color = new int[3]; 
    color[0] = color[1] = color[2] = 0; 
    return color; 
} 

class Color 
{ 
public: 
    static int const * const BLACK; 
}; 
int const * const Color::BLACK = make_black(); 
+0

Вы попробовали это? Visual Studio не разрешает инициализаторы {0,0,0} декларации стиля указателя. – Bruce

+0

VS2013 и далее, поскольку это более новая функция C++. Однако теперь кажется, что вы используете более раннюю версию. Я не знаю, как сделать инициализацию выделенной памяти без этой функции pre C++ 11. Возможно, вам придется назначить неконстантный указательный тип и инициализировать значения, когда ваше приложение начнет выполнение. – qeadz

+0

@ Bruce на дальнейшее рассмотрение, если вы расслабились на желание выделить на линии, где Color :: BLACK (например) инициализирован, вы можете сделать это с помощью заводской функции. Я изменил ответ. – qeadz

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