2013-02-21 4 views
0

Так что, если у меня есть гетерогенная коллекция автомобилей объектовC++ Как рассказать об отдельных типах объектов из гетерогенной коллекции?

автомобиля * с = {грузовик, фургон, кабриолет}

Если коллекция объектов была случайной, и я хотел, чтобы пройти через коллекцию с цикл , как я могу проверить конкретный тип объекта?

+1

Использовать ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)? –

+0

Просто переработайте приложение, чтобы вам не нужно было знать настоящий тип. –

+0

Зачем вам нужен тип объекта? – Johnsyweb

ответ

6

Вы бы использовать dynamic_cast:

if (truck* truck_p = dynamic_cast<truck*>(car_p)) { 
    // car_p points at a truck 
} 

dynamic_cast будет проверять динамический тип объекта, на который указывает car_p и разрешить только бросок, если это truck. Если это не truck, это даст значение нулевого указателя, и поэтому условие if не будет выполнено.

Однако необходимость протестировать динамический тип, подобный этому, указывает на плохой дизайн кода. Весь смысл полиморфизма заключается в том, что вы можете обрабатывать любые производные объекты, как если бы это был базовый объект, - не должно быть необходимости точно проверять, какой производный тип он был. Если вам нужно проверить динамический тип Car, так что вы можете сделать на нем определенную операцию truck, тогда вы не должны бросать этот truck в контейнер Car*.

1

Постарайся смотреть на RTTI:

http://en.wikipedia.org/wiki/Run-time_type_information

Это Run Time Type Information. Вы также можете добавить переменную-член в каждый производный тип, указав, какой тип она есть, и использовать ее для проверки.

2

Если вам нужно знать производный тип, то полиморфизм не является подходящим инструментом для работы. Я бы предложил использовать boost::variant или эквивалент для реализации visitor pattern.