полиморфизм — C ++, как проверить класс, чтобы увидеть, есть ли у него член?

Как вы тестируете объект, чтобы увидеть, есть ли у него определенный член? Или есть способ узнать, является ли объект экземпляром определенного класса?

Я работаю со структурой наследования персонажей-картинок. Это String_Pics, HCat_Pics, VCat_Pics и Frame_Pics. Все они происходят от Pic_Base. Пользователь использует дескриптор класса «Picture», который содержит умный указатель на объекты. Каждый объект хранит указатель на изображение, на котором он основан (кадр другого изображения, два изображения, соединенные горизонтально и т. Д.).

Пример: Frame-Pic вокруг VCat-Pic, и оба изображения в VCat-Pic являются Frame_Pics вокруг String_Pics.

***************
*             *
* *********** *
* * This    * *
* * is      * *
* *********** *
* *********** *
* * The     * *
* * Example * *
* *********** *
*             *
***************

Frame_Pics имеет данные-члены для «кадровых символов», но никакой другой класс не имеет. Я пишу функцию, которая будет рекурсивно изменять символы кадра для каждого кадра в структуре. Может быть, я упускаю способ сделать это иначе, но я ищу способ проверить, является ли объект, с которым я имею дело, Frame_Pic или нет, и, следовательно, будет ли означать что-нибудь, чтобы попытаться изменить символы кадра ,

Мой первый инстинкт был попробовать что-то вроде if (p->frame_char) где frame_char — это имя одного из членов данных Frame_Pic, но я не знаю, как это сделать.

0

Решение

Вы можете попытаться динамически привести указатель к Frame_pic и посмотреть, если он возвращает ненулевое значение.

Frame_Pic *frame =dynamic_cast<Frame_Pic*>(p);
if(frame  != nullptr){
//It is Frame_Pic
frame->frame_char;
}

Не очень хорошая идея, чтобы пойти cast хотя … Попытайтесь написать виртуальные функции, которые избавят от необходимости в этом.

2

Другие решения

Оказалось, мне действительно не нужно проходить прямой тест на членство. Это была проблема, которая хорошо подходила для полиморфизма:

Я объявил virtual Функция «reframe» в Pic_Base и определил версию для «frame» для изменения символов, а также для других классов, чтобы при необходимости повторять вложенные изображения.

1

По вопросам рекламы [email protected]