2010-10-11 9 views
0

У меня есть член класса static const array (const указывает на SDL_Surfaces, но это неуместно), и ему нужно пройти его, чтобы заполнить его. Помимо const_cast, когда я делаю цикл, который я слышу, это плохая практика, как бы я это сделал?Является ли const_cast приемлемым при определении массива?

EDIT: Поэтому я не просто сделать ...

static SDL_Surface *const myArray[3]; 
... 
class::myArray[3] = {...}; 

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

EDIT 2: Я думаю, что, возможно, я сделал концептуальную ошибку. Возможно ли const_cast каким-то образом сделать что-то const, а не удалять его константу, чего я пытаюсь сделать? Если нет, то я был немного глупым, прося об этом: D

+1

Если вы не можете инициализировать массив с его окончательным значением, вы не сможете создать массив 'const'. Возможно, вам следует более подробно рассказать о проблеме, которую вы пытаетесь решить? –

+0

Что вы заселяете? – JoshD

+1

Если объект const, когда вы пишете его, вы получаете неопределенное поведение. Период. Вам нужно * инициализировать * его, а не назначать. – GManNickG

ответ

1

Один из способов обеспечения «логической консистенции» заключается в том, чтобы сделать данные недоступными, за исключением не мутирующих средств.

Например:

class foo 
{ 
public: 
    const bar& get_bar() { return theBar; } 

private: 
    static bar theBar; 
}; 

Даже если theBar не является постоянным, так как foo это единственное, что может изменить его, до тех пор, как он делает это правильно, вы по существу (логически) имеют постоянную bar.

+0

Насколько я могу судить, это был бы лучший способ сделать то, что я пытаюсь сделать. Спасибо! – Lewis

0

Прежде всего, зачем вам нужно что-то, что объявлено постоянным?

+0

Я считаю, что он хочет его инициализировать. – Gunslinger47

+0

@YeenFei Вы ввели комментарий в качестве ответа. Введите это как комментарий, а затем дайте ответ на инициализацию массива констант. – octopusgrabbus

3

Если вы пытаетесь инициализировать его, и если это массив, просто сделать это со списком инициализации:

static const int myarray[] = {1,2,3,4,5,6}; 
+0

Что вы подразумеваете под «это работает только для примитивных типов»? –

+0

@Charles Bailey: Я имею в виду, что это невозможно сделать для массива, скажем, Тракторов. Неужели я ошибаюсь? Я подозреваю, что это возможно с некоторыми знаниями о макете класса и большой головной болью. Я хотел бы узнать больше, если ошибаюсь. – JoshD

+1

До тех пор, пока у «Тракторов» есть соответствующие неявные конструкторы из предоставленных инициализаторов, нет оснований, что я знаю, что инициализация «нормального» массива не должна работать. –

3

Если массив const и вы используете const_cast, чтобы вы могли писать значения в него вы вызываете undefined поведение.

Это почти повсеместно не приемлемая практика.

+1

+1 за сообщение о важном предупреждении об этой практике. – JoshD

1
typedef boost::array< const SDL_Surface *, 100 > surfaces_t; 

class A { 
    static const surfaces_t surfaces; 
}; 

surfaces_t initialize_surfaces() 
{ 
    // ... 
} 

const surfaces_t A::surfaces = initialize_surfaces(); 

Что касается EDIT 2: вы не можете изменить тип объекта после его объявления. Каста не делают этого, это невозможно в C++. Какие приведения делают это, чтобы сформировать выражение данного типа из выражения другого типа с соответствующей семантикой, которые различны для разных типов приведений. Для const_cast вы можете добавить/удалить const, и вы можете добавить/удалить volatile, и ничего больше.

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

  • Нет связанных вопросов^_^