Как вы тестируете объект, чтобы увидеть, есть ли у него определенный член? Или есть способ узнать, является ли объект экземпляром определенного класса?
Я работаю со структурой наследования персонажей-картинок. Это 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, но я не знаю, как это сделать.
Вы можете попытаться динамически привести указатель к Frame_pic
и посмотреть, если он возвращает ненулевое значение.
Frame_Pic *frame =dynamic_cast<Frame_Pic*>(p);
if(frame != nullptr){
//It is Frame_Pic
frame->frame_char;
}
Не очень хорошая идея, чтобы пойти cast
хотя … Попытайтесь написать виртуальные функции, которые избавят от необходимости в этом.
Оказалось, мне действительно не нужно проходить прямой тест на членство. Это была проблема, которая хорошо подходила для полиморфизма:
Я объявил virtual
Функция «reframe» в Pic_Base и определил версию для «frame» для изменения символов, а также для других классов, чтобы при необходимости повторять вложенные изображения.