Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / имя класса в рантайм / 25 сообщений из 33, страница 1 из 2
09.08.2007, 15:04:06
    #34717313
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
может конечно уже поднималась эта тема, дайте тынц...

как можно узнать во время выполнения программы win32 api имя класса.

к примеру в mfc есть для этого IsKindOf(..) и если объект производный от CObject (а там почти все такие) то получить имя класса не составит труда.

каким образом это сделать в win32 api? если можно в принципе.

спасибо
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
09.08.2007, 15:23:03
    #34717389
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
typeid(class).name();

Но:
1) вроде, если класс не имеет виртуальных функций, то ничего не получиться.
2) имя класса может не совсем совпадать с нем что вернет name(). НАпример, gcc вставляет в начале чило, означающее количество символов в имени файла
...
Рейтинг: 0 / 0
09.08.2007, 15:31:37
    #34717432
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
компилятор vc2005 sp1
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
09.08.2007, 15:36:25
    #34717460
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Cerebrumкомпилятор vc2005 sp1
--------------------------------------------------------------
[не претендую на уникальность]

Попробуй
...
Рейтинг: 0 / 0
09.08.2007, 15:39:40
    #34717477
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
классная мысль, но не получилось, точнее получилось, но не совсем, для производного от HWND класса он вернул _HWND struct*, вместо имени производного

может еще что-нибудь есть
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
09.08.2007, 15:44:24
    #34717493
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
ан нет, peacedoorball я все работает, СПАСИБО!
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
09.08.2007, 16:51:36
    #34717762
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
вот пытаюсь запихать сделать функцию из из этого typeid, но что-то не получается с параметрами...
думал получиться если приводить объекты класса к void* и передавать на обработку, но он опознает их так как они и объявлены, т.е. void*. Есть ли какой-нибудь RUNTIME_CLASS определитель на этот случай??

Еще раз СПАСИБО
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
09.08.2007, 17:26:49
    #34717911
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Cerebrumвот пытаюсь запихать сделать функцию из из этого typeid, но что-то не получается с параметрами...
думал получиться если приводить объекты класса к void* и передавать на обработку, но он опознает их так как они и объявлены, т.е. void*. Есть ли какой-нибудь RUNTIME_CLASS определитель на этот случай??

Еще раз СПАСИБО
--------------------------------------------------------------
[не претендую на уникальность]

Отнаследовать?
...
Рейтинг: 0 / 0
09.08.2007, 17:29:42
    #34717924
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
class Base {
    public:
        virtual ~Base() {};
};

class A : public Base {
    public:
    virtual ~A() {};
};

class ABCDDDDDDDDDDDD : public Base {
    public:
    virtual ~ABCDDDDDDDDDDDD() {};
};

void func(Base &base_) {
    cout << typeid(base_).name() << endl;
};

int main() {

    A a;
    ABCDDDDDDDDDDDD abc;

    func(a);
    func(abc);

    return  0 ;
}


автор

1A
15ABCDDDDDDDDDDDD
...
Рейтинг: 0 / 0
09.08.2007, 17:29:50
    #34717926
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
в смысле сделать для каждого класса вируальную функцию возвращающую его имя?
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
09.08.2007, 17:30:27
    #34717928
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Cцылку в функции констом уделать.
...
Рейтинг: 0 / 0
09.08.2007, 17:32:04
    #34717938
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Akh[src c++]
class Base {
public:
virtual ~Base() {};
};
....
1A
15ABCDDDDDDDDDDDD
[/quot]

во именно так я и сделал, но пока не попробывал думал что будут возвращаться только Base, вместо ABCDDDDDDDDDD


СПАСИБО, без тебя я бы не справился
...
Рейтинг: 0 / 0
09.08.2007, 17:33:21
    #34717943
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Cerebrumв смысле сделать для каждого класса вируальную функцию возвращающую его имя?
--------------------------------------------------------------
[не претендую на уникальность]

Можно и так. Виртуальность ей, кстати, не за чем. typeid(*this) - вернет описание созданного класса, т.е. потомка.
...
Рейтинг: 0 / 0
09.08.2007, 17:34:58
    #34717951
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Akh
Можно и так. Виртуальность ей, кстати, не за чем. typeid(*this) - вернет описание созданного класса, т.е. потомка.
склоняюсь к этой идее, нежели чем к отдельной глобальной функции
...
Рейтинг: 0 / 0
09.08.2007, 17:45:28
    #34718004
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Cerebrum Akh
Можно и так. Виртуальность ей, кстати, не за чем. typeid(*this) - вернет описание созданного класса, т.е. потомка.
склоняюсь к этой идее, нежели чем к отдельной глобальной функции

А смысл? typeid(object) - можно расценивать как имя объекта, т.е. object. Тогда name() получается именем функции.

Что мы имеем от ввода общего родителя и ввода новой функции которая возвращает typeid(*this).name()?
1) Если деструктор предка будет виртуальным, то гарантируется наличие функциональности.
2) Получение Адаптера-метода. Если мы хотим, чтобы возвращалось std::string, а не char *, то можно конвертнуть в функции.
Только есть ли толк в этом?
...
Рейтинг: 0 / 0
09.08.2007, 17:52:31
    #34718036
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Akh пишет:

> в смысле сделать для каждого класса вируальную функцию возвращающую его имя?

Именно так и делает typeid(). Зачем же писать свой ?

> Можно и так. Виртуальность ей, кстати, не за чем. typeid(*this) - вернет
> описание созданного класса, т.е. потомка.

typeid() - виртуальная функция.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
09.08.2007, 17:57:43
    #34718061
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Слышал звон, а не знает где он.

MasterZiv
Akh пишет:

> в смысле сделать для каждого класса вируальную функцию возвращающую его имя?

Именно так и делает typeid(). Зачем же писать свой ?

Автор не верен.
Про утверждение написано далее и более подробно.

MasterZiv
> Можно и так. Виртуальность ей, кстати, не за чем. typeid(*this) - вернет
> описание созданного класса, т.е. потомка.

typeid() - виртуальная функция.
Posted via ActualForum NNTP Server 1.4

Ну, и?
...
Рейтинг: 0 / 0
09.08.2007, 18:01:24
    #34718079
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Akh пишет:

> 1) вроде, если класс не имеет виртуальных функций, то ничего не получиться.

Не вроде, а так и есть. Компилятор потребует наличие хотя бы одного виртуального
метода, чтобы класс стал полиморфным.

> 2) имя класса может не совсем совпадать с нем что вернет name().
> НАпример, gcc вставляет в начале чило, означающее количество символов в
> имени файла

Там еще много тонкостей. Например, пространство действия для typeid() -
один исполняемый модуль. Если у тебя несколько .DLL , то typeid() одного
и того же класса может быть разным в разных .dll.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
09.08.2007, 18:04:00
    #34718087
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
MasterZivtypeid() - виртуальная функция.

Что значит виртуальная функция. Виртуальный метод, это понятно.

typeid() - результат зависит от полиморфного аргумента. Это понямается под виртуальной функцией?
...
Рейтинг: 0 / 0
09.08.2007, 19:06:28
    #34718271
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
уф, спасибо просветили
...
Рейтинг: 0 / 0
10.08.2007, 10:45:45
    #34719073
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Akh пишет:

> typeid() - виртуальная функция.
> Что значит виртуальная функция. Виртуальный метод, это понятно.
Это вообще-то синонимы.

> typeid() - результат зависит от полиморфного аргумента. Это понямается
> под виртуальной функцией?

Естественно, в каждой иерархии классов, начинающейся от одного корневого
класса, typeid() свой. Я имел в виду, что вызов typeid() выполняется
виртуально.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10.08.2007, 10:58:47
    #34719120
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
MasterZiv
Akh пишет:

> typeid() - виртуальная функция.
> Что значит виртуальная функция. Виртуальный метод, это понятно.
Это вообще-то синонимы.

> typeid() - результат зависит от полиморфного аргумента. Это понямается
> под виртуальной функцией?

Естественно, в каждой иерархии классов, начинающейся от одного корневого
класса, typeid() свой. Я имел в виду, что вызов typeid() выполняется
виртуально.
Posted via ActualForum NNTP Server 1.4

Странно, я вообще-то думал, что typeid() получает вирутальную таблицу и с нее выбирает описание класса. Что-то тут не то.

В данном контексте, это не синонимы. Я специально их разграничил наличием класса функции.
...
Рейтинг: 0 / 0
10.08.2007, 11:00:53
    #34719129
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Akh пишет:

> Странно, я вообще-то думал, что typeid() получает вирутальную таблицу и
> с нее выбирает описание класса. Что-то тут не то.

Да, да, именно так! typeid() получает вирутальную таблицу через указатель
this, как и любой другой виртуальный метод (функция) и из нее, т.е. через
нее выбирает описание класса.

> В данном контексте, это не синонимы. Я специально их разграничил
> наличием класса функции.

Ты ограничил, а все другие люди этого не делают. Это синонимы.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10.08.2007, 11:14:25
    #34719176
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
MasterZiv
Akh пишет:

> Странно, я вообще-то думал, что typeid() получает вирутальную таблицу и
> с нее выбирает описание класса. Что-то тут не то.

Да, да, именно так! typeid() получает вирутальную таблицу через указатель
this, как и любой другой виртуальный метод (функция) и из нее, т.е. через
нее выбирает описание класса.

Т.о. typeid() один на всех. :)

MasterZiv
> В данном контексте, это не синонимы. Я специально их разграничил
> наличием класса функции.

Ты ограничил, а все другие люди этого не делают. Это синонимы.

Метод более узкое понятие, следовательно они не равнозначны.
...
Рейтинг: 0 / 0
10.08.2007, 15:31:02
    #34720267
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
имя класса в рантайм
Akh пишет:
> Т.о. typeid() один на всех. :)

На каждую иерархию классов свой.
Для каждого дерева в лесе наследования.
А внутри леса для typeid() работает перегрузка.

> Метод более узкое понятие, следовательно они не равнозначны.

Это твое личное мнение. Можешь и далее так думать, если тебе
так нравится.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / имя класса в рантайм / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]