Является ли const_cast приемлемым при определении массива? - PullRequest
0 голосов
/ 11 октября 2010

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

РЕДАКТИРОВАТЬ: причина, по которой я не просто делаю ...

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

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

РЕДАКТИРОВАТЬ 2: Я думаю, что я мог допустить концептуальную ошибку здесь,Можно ли каким-то образом const_cast сделать что-то const вместо того, чтобы удалить его, что я и пытался сделать?Если нет, то я немного глупо спрашиваю: D

Ответы [ 5 ]

3 голосов
/ 11 октября 2010

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

static const int myarray[] = {1,2,3,4,5,6};
3 голосов
/ 11 октября 2010

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

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

1 голос
/ 11 октября 2010

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

Например:

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

private:
    static bar theBar;
};

Даже если theBar isn 't константа, так как foo - единственное, что может ее изменить, если она делает это правильно, у вас, по сути (логически), есть константа bar.

1 голос
/ 11 октября 2010
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 и ничего больше.

0 голосов
/ 11 октября 2010

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

...