Является ли const_cast приемлемым при определении массива?
У меня есть статический член класса массива const (константные указатели на SDL_Surfaces, но это не имеет значения), и я должен пройти через него, чтобы заполнить его. Кроме const_cast, когда я закончу цикл, который, как я слышал, является плохой практикой, как бы я поступил так?
РЕДАКТИРОВАТЬ: Причина, по которой я не просто делаю...
static SDL_Surface *const myArray[3];
...
class::myArray[3] = {...};
является то, что мне нужно прочитать из другого массива и запустить функцию на соответствующем значении другого массива, чтобы получить значение для этого массива. После того, как я прошел весь цикл, я больше никогда не изменяю этот массив, так что, как я вижу, он должен быть константным.
РЕДАКТИРОВАТЬ 2: Я думаю, что я мог сделать концептуальную ошибку здесь. Можно ли каким-то образом const_cast сделать что-то const вместо того, чтобы удалить его, что я и пытался сделать? Если нет, то я немного глупо спрашиваю это:D
5 ответов
Один из способов обеспечить "логическое постоянство" - сделать данные недоступными, кроме как с помощью немутантных средств.
Например:
class foo
{
public:
const bar& get_bar() { return theBar; }
private:
static bar theBar;
};
Даже если theBar
не является постоянным, так как foo
это единственное, что может изменить его, если он делает это правильно, у вас, по сути (логически) есть константа bar
,
Если ваш массив const
и вы используете const_cast
чтобы вы могли записать значения в него, вы вызываете неопределенное поведение.
Это почти повсеместно неприемлемая практика.
Если вы пытаетесь инициализировать его, и если это массив, просто сделайте это с помощью списка инициализации:
static const int myarray[] = {1,2,3,4,5,6};
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 и ничего больше.
Прежде всего, зачем вам нужно что-то менять, что объявлено постоянным?