Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2010, 10:56   #1
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию аналог Дельфийского оператора is

есть ли такой?

на всякий напишу:
оператор is это оператор возвращающий true если указанный объект(параметр 1) имеет указанный класс(второй параметр) в прямых или косвенных(предок предка) предках, иначе false. иначе говоря если указанный объект может быть приведен к указанному классу.
<operator 1> is <operator 2>
FS:TFileStream;//иерархия THandleStream->TStream

FS is TStream//вернет true
FS is TStrings//вернет false
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.12.2010, 11:09   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Вроде бы так:
Код:
TFileStream* fs;
//...
if (dynamic_cast<TStream*>(fs))
 {
 //...
 }
P.S. Хотя нет, это скорее для обратного преобразования, типа такого:
Код:
TFileStream* fs, *fs2;
TStream* s;
//...
s = fs;
//Работаем с s как с TStream
if (fs = dynamic_cast<TFileStream*>(s))
 {
 //...
 }
А преобразование типа потомка к типу предка, по идее, не требует никаких особенных действий. Если тип A имеет предка B, то объектам типа B можно спокойно присваивать объекты типа A (но не наоборот, если не использовать касты), и с объектами A работать как с B. Информация о предках доступна на этапе компиляции.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же

Последний раз редактировалось Гром; 11.12.2010 в 11:18.
Гром вне форума Ответить с цитированием
Старый 11.12.2010, 15:30   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

если нужно узнать имя класса, можно воспользоваться rtti и typeid().

но если тебе нужно узнать, можно ли конвертнуть 1 объект в другой, то нужно использовать хитрость, например от александрески.

Код:
template<typename T, typename U>
class IsDerivedFrom {
	typedef char Small;
	class Big { Small dummy[2]; };
	static Small Test(const U &);
	static Big Test(...);
	static T MakeT();
public:
	enum { Is = sizeof(Test(MakeT())) == sizeof(Small) };
};

class A {};
class B : public A {};
class C {};

int main()
{
	cout << IsDerivedFrom<B, A>::Is << endl;
        cout << IsDerivedFrom<B, C>::Is << endl;
        cout << IsDerivedFrom<int, int *>::Is << endl;
	return 0;
}
проверка происходит во время компиляции, а не как в делфе, в рантайме. хотя и своего рода костыль. в плюсах вообще очень, очень очень много костылей приходится придумывать. поэтому у меня вызывают улыбку люди, которые в профиле пишут "влюбленный в С++" и тому подобное
аналогичная идея есть и у страуструпа, но я ее не помню
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance

Последний раз редактировалось pproger; 11.12.2010 в 16:31.
pproger вне форума Ответить с цитированием
Старый 11.12.2010, 17:37   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

да в том то и дело что нужно в ран тайме, я страницу сохраню, проверю когда дома буду(завтра вечером).
если кто еще вариантов подкинет буду рад.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.12.2010, 17:48   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Пепел Феникса
в рантайме я уже сказал - typeid
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 13.12.2010, 13:44   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

спасибо всем
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Аналог Дельфийского DropDownCount Stilet Общие вопросы .NET 0 27.10.2010 16:29
перегрузка оператора -> alex_alpha Общие вопросы C/C++ 5 23.06.2010 19:07
Аналог оператора из С/С++ BuBlicK.SQP Паскаль, Turbo Pascal, PascalABC.NET 3 18.06.2010 13:10
использование условного оператора в теле оператора цикла с условием машко Помощь студентам 2 21.06.2009 23:55
Перегрузка оператора + z3rg Общие вопросы C/C++ 1 22.03.2009 03:06