Как узнать тип объекта c
Перейти к содержимому

Как узнать тип объекта c

Как узнать тип объекта c

БлогNot. Как в C++ программно узнать тип переменной?

Как в C++ программно узнать тип переменной?

Был вчера вопросик, а я не ответил впохыхах.

Коротко: для этого уже в стандарте C++98 есть оператор typeid:

Подробнее: посмотрим, как работает typeid со встроенными и с определёнными пользователем типами данных (прежде всего, классами).

Прилагаемый маленький листинг из консоли Visual Studio 2015, думаю, хорошо показывает суть дела.

Как проверить тип объекта во время выполнения программы на C#?

user avatar

Только is вернёт true , если obj является подклассом MyObject , иногда это нежелательно. Для точного сравнения типов пишите так:

Оператор is языка C# проверяет является ли объект экземпляром типа или производного от него типа.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками c# c#-faq или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

8.6. Определение типа объекта во время выполнения

Во время выполнения требуется динамически узнавать тип определенного класса.

Для запроса, на объект какого типа указывает адрес объекта, используйте идентификацию типов во время выполнения (обычно называемую просто RTTI — runtime type identification). Пример 8.6 показывает, как это делается.

Пример 8.6. Использование идентификации типов во время выполнения

using namespace std;

class Derived : public Base <>;

// Используем typeid для проверки равенства типов

if (typeid(b) == typeid(d)) < // No

cout << «b и d имеют один и тот же тип. «;

if (typeid(b) == typeid(bb)) < // Yes

cout << «b и bb имеют один и тот же тип. «;

it (typeid(a) == typeid(Derived)) < // Yes

cout << «d имеет тип Derived. «;

Пример 8.6 показывает, как использовать оператор typeid для определения и сравнения типов объектов, typeid принимает выражение или тип и возвращает ссылку на объект типа type_info или его подкласс (что зависит от реализации). Возвращенное значение можно использовать для проверки на равенство или получить строковое представление имени типа. Например, сравнить типы двух объектов можно так.

if (typeid(b) == typeid(d)) <

Это выражение возвращает истину, если возвращаемые объекты type_info равны. Это работает благодаря тому, что typeid возвращает ссылку на статический объект, так что при его вызове для двух объектов одного и того же типа будут получены две ссылки на один и тот же объект и сравнение вернет истину.

typeid также можно использовать непосредственно с типом, как здесь.

if (typeid(d) == typeid(Derived)) <

Это позволяет явно проверять определенный тип.

Вероятно, наиболее часто typeid используется для отладки. Для записи имени типа используйте type_info::name, как здесь.

std::cout << typeid(d).name() << std::endl;

При передаче объектов различных типов это может быть очень полезно. Строка, завершающаяся нулем, возвращаемая name, зависит от реализации, но вы можете ожидать (но не полагаться на это), что она будет равна имени типа. Это также работает и для встроенных типов.

Не злоупотребляйте этой методикой, основывая на информации о типе логику программы, если это не абсолютно необходимо. В общем случае наличие логики, которая выполняет что-то похожее на следующее, расценивается как плохой дизайн.

Если obj имеет тип X, сделать что-то одно, а если obj имеет тип Y, сделать что-то другое.

Это плохой дизайн, потому что клиентский код теперь содержит избыточные зависимости от типов используемых объектов. Это также приводит к большой каше из if/then кода, который то и дело повторяется, если для объектов типов X или Y требуется различное поведение. Объектно-ориентированное программирование и полиморфизм существуют в большой степени для того, чтобы избавить нас от написания подобного рода логики. Если для какого-либо семейства связанных классов требуется зависящее от типа поведение, то они все должны наследоваться от какого-то базового класса и использовать виртуальные функции, динамически вызывая различное поведение в зависимости от типа.

RTTI приводит к накладным расходам, так что компиляторы обычно по умолчанию его отключают. Скорее всего ваш компилятор имеет параметр командной строки для включения RTTI. Также это не единственный способ, которым можно получить информацию о типе. Другая методика приведена в рецепте 8.7.

Читайте также

Глава 27 Динамическая загрузка во время выполнения

Глава 27 Динамическая загрузка во время выполнения Загрузка разделяемых (совместно используемых) объектов во время выполнения может оказаться полезным способом для структурирования собственных приложений. Если правильно организовать этот процесс, то тогда можно будет

Практическое определение объекта

Практическое определение объекта Вы можете заметить, что порой представить объект VBA в материально осязаемом виде не так-то просто. Но это и к лучшему — чем дальше вы уходите от материализации объектов, тем свободнее будете себя чувствовать при работе со всем диапазоном

Определение объекта Range

Определение объекта Range В Excel имеется несколько возможных методов идентификации диапазона из одной или нескольких ячеек, на который должен воздействовать написанный код. Для достижения данной цели используются следующие.Стандартная ссылка на ячейку. Так называемый

15.8.2. Emacs и отладка во время выполнения

15.8.2. Emacs и отладка во время выполнения Для обнаружения ошибок времени выполнения Emacs предоставляет аналогичную возможность интеграции с символическим отладчиком, т.е. разработчик может использовать какой-либо Emacs-режим для установки контрольных точек в программах и

15.8.2. Emacs и отладка во время выполнения

15.8.2. Emacs и отладка во время выполнения Для обнаружения ошибок времени выполнения Emacs предоставляет аналогичную возможность интеграции с символическим отладчиком, т.е. разработчик может использовать какой-либо Emacs-режим для установки контрольных точек в программах и

1.4.1. Кодирование во время выполнения

1.4.1. Кодирование во время выполнения Мы уже упоминали директивы load и require. Важно понимать, что это не встроенные предложения и не управляющие конструкции; на самом деле это методы. Поэтому их можно вызывать, передавая переменные или выражения как параметры, в том числе

Определение "объекта приложения"

Определение "объекта приложения" В настоящее время тип HelloClass решает две задачи. Во-первых, этот класс определяет точку входа в приложение (метод Main()). Во-вторых, HelloClass поддерживает элемент данных и несколько конструкторов. Все это хорошо и синтаксически правильно, но

6.12.1. Определение объекта map и заполнение его элементами

6.12.1. Определение объекта map и заполнение его элементами Чтобы определить объект класса map, мы должны указать, как минимум, типы ключа и значения. Например:mapstring,int word_count;Здесь задается объект word_count типа map, для которого ключом служит объект типа string, а ассоциированным с ним

19.1. Идентификация типов во время выполнения

19.1. Идентификация типов во время выполнения * RTTI позволяет программам, которые манипулируют объектами через указатели или ссылки на базовые классы, получить истинный производный тип адресуемого объекта. Для поддержки RTTI в языке C++ есть два оператора: оператор dynamic_cast

Выяснение типа объекта в период выполнения

Выяснение типа объекта в период выполнения Разработчики ОО-ПО вскоре вырабатывают здоровую неприязнь к любому стилю вычислений, основанному на явном выборе между различными типами объекта. Полиморфизм и динамическое связывание намного предпочтительнее. Однако в

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *