powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / имя класса в рантайм
33 сообщений из 33, показаны все 2 страниц
имя класса в рантайм
    #34717313
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может конечно уже поднималась эта тема, дайте тынц...

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

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

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

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

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

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

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

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

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

Отнаследовать?
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34717924
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
имя класса в рантайм
    #34717926
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в смысле сделать для каждого класса вируальную функцию возвращающую его имя?
--------------------------------------------------------------
[не претендую на уникальность]
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34717928
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cцылку в функции констом уделать.
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34717938
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh[src c++]
class Base {
public:
virtual ~Base() {};
};
....
1A
15ABCDDDDDDDDDDDD
[/quot]

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


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

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

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

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

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

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

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

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

MasterZiv
Akh пишет:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Это твое личное мнение. Можешь и далее так думать, если тебе
так нравится.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34720605
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Akh пишет:
> Т.о. typeid() один на всех. :)

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


Не понятно, почему так сложно...

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

Это твое личное мнение. Можешь и далее так думать, если тебе
так нравится.
Posted via ActualForum NNTP Server 1.4

Это не мое личное мнение.
Метод - функция класса. Этим уже все сказано.
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34723426
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:
> Не понятно, почему так сложно...

Попробуй предложить свой вариант, попроще...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34723479
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Akh пишет:
> Не понятно, почему так сложно...

Попробуй предложить свой вариант, попроще...
Posted via ActualForum NNTP Server 1.4

Код: plaintext
1.
2.
3.
type_info const *typeid(void*this_) {
    return reintrpet_cast<type_info*>(reinterpret_cast<int*>(this_)[ 0 ]);
};

Недостаток - потеря типизации. Да, понятно, походу для искоренения не верного применения и нужны перегрузки typeid.

ЗЫ: Все равно не понимаю, при чем тут виртуальность.
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34724149
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:
> ЗЫ: Все равно не понимаю, при чем тут виртуальность.

typeid() - виртуальная функция. Какое слово из этих вам не понятно ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34724277
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Akh пишет:
> ЗЫ: Все равно не понимаю, при чем тут виртуальность.

typeid() - виртуальная функция. Какое слово из этих вам не понятно ?
Posted via ActualForum NNTP Server 1.4

На основании чего сделан такой вывод?
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34724827
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh пишет:
> На основании чего сделан такой вывод?

Все, Акх, спасибо за содержательную беседу, досвидания.
В топик отвечать больше не буду.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34724962
ErV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh wrote:

> typeid(class).name();
Это "не оно". Человек просил функцию, которая по HWND возвращает MFC класс,
соответствующий окну. Такая (как я помню), есть, но как называется - забыл,
так как с MFC не работал.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
имя класса в рантайм
    #34725378
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Akh пишет:
> На основании чего сделан такой вывод?

Все, Акх, спасибо за содержательную беседу, досвидания.
В топик отвечать больше не буду.
Posted via ActualForum NNTP Server 1.4

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


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