Является ли 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 и ничего больше.

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

Другие вопросы по тегам