Учитывая базовый класс gameObject
и производный класс animatedGameObject
, я подумал, что было бы неплохо хранить все их экземпляры в классе std::vector
. Если вектор GameObjects
объявлен базовым типом gameObject*
, экземпляры производных объектов требуют приведения.
Пример:
vector<gameObject*> GameObjects;
gameObject A* = new gameObject( ...init... );
animatedGameObject B* = new animatedGameObject( ...init... );
GameObjects.push_back(A);
GameObjects.push_back(B);
// to access the animatedGameObject functions:
static_cast<animatedGameObject*>(GameObjects[1])->functionUniqueToAnimated();
Испугавшись, как обычно, я обратился к Скотту Мейерсу (Effective C++, 3rd Edition), который пишет по этому поводу:
Многие программисты считают, что приведения не делают ничего, кроме указания компилятору рассматривать один тип как другой, но это ошибочно. Любые преобразования типов (явные с помощью приведения типов или неявные с помощью компиляторов) часто приводят к тому, что код выполняется во время выполнения.
Я дважды прочитал его пункт 27: Минимизируйте кастинг, но, учитывая мою неопытность в этом, я борюсь с неспособностью ответить на простой вопрос "ЭТО ТУПОЕ СДЕЛАТЬ?"
Я должен упомянуть, что есть несколько причин, по которым это это глупость, которые не имеют ничего общего с вызовом static_cast
. Вопросы в порядке важности:
- Разве я не вижу некоторых возможных рисков при использовании
static_cast
в моем примере выше? - Существуют ли лучшие структуры данных, чем
std::vector
для таких подходов? (только если есть одно очевидное, я не прошу вас проводить мое исследование для меня.)
Я впервые задаю здесь вопрос, поэтому заранее извиняюсь, если это необходимо.
draw()
как виртуальную функцию в базовом классе. Затем вы могли бы просто вызвать его без приведения, и это было бы правильно. Вы знаете об этом, но хотите знать конкретно об эффектах гипса? - person jogojapan   schedule 01.07.2013[1]
содержит анимированный объект? Я имею в виду в реальной версии вашего кода. Часто эта информация может быть перемещена в структуру программы или использована для улучшения упаковки актерского состава или его исключения. - person Yakk - Adam Nevraumont   schedule 01.07.2013