powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Определение класса по указателю
19 сообщений из 19, страница 1 из 1
Определение класса по указателю
    #38561784
Medvedev_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Есть такая задача: приходит число num типа int. Это указатель либо на элемент класса А либо на элемент класса B.
Как узнать, на какой элемент указывает мой указатель?
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38561799
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Medvedev_A,

число не может быть указателем.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38561803
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Medvedev_Aчисло num типа int. Это указатель
int это не указатель. Это число. Но если привести его к указателю на общего предка классов
А и В и при этом программа собрана с поддержкой rtti, то typeid определит тип объекта на
который он указывает.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38561823
Medvedev_A
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,
общего предка нет. Два разных класса.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38561828
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Medvedev_Aобщего предка нет.
Так сделай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38561849
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMedvedev_Aчисло num типа int. Это указатель
int это не указатель. Это число. Но если привести его к указателю на общего предка классов
А и В и при этом программа собрана с поддержкой rtti, то typeid определит тип объекта на
который он указывает.


для этого не обязательно иметь общего предка классов. Достаточно просто включенного rtti.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38561936
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivдля этого не обязательно иметь общего предка классов. Достаточно просто
включенного rtti.
Попробовал в GCC - недостаточно. Покажешь примерчик?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38561997
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Пока суть да дело -- с чего ты решил, что нужен общий предок для этого? каков твой ход мыслей?
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38561999
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДостаточно просто включенного rtti
и как минимум одна виртуальная функция нужна.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562010
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Сори, я понял, о чём ты. Да, ты отчасти прав, по крайней мере надо найти в стандарте подтверждение, что такое переносимо и гарантированно будет работать. Дело в том, что для RTTI создаются как бы невидимые виртуальные функции (вроде бы одна только), и при этом класс для RTTI обязан быть полиморфным. Так вот, поскольку функция неявно создаваемая, то не понятно из какой ячейки VFPT брать функцию typeid ...

Тем не менее, такая хрень работает (VC2013).

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
// rtti.cpp : Defines the entry point for the console application.
//

#include <iostream>
#include <typeinfo.h>


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

class AA : public A 
{
};

class B
{
public:
	virtual ~B() {}
};

int main(int argc, char* argv[])
{
	{
		A* pa = new A;
		std::cout << typeid(*pa).name() << std::endl;
		delete pa;
	}
	{
		A* pa = new AA;
		std::cout << typeid(*pa).name() << std::endl;
		delete pa;
    }

	{
		B* pb = new B;
		std::cout << typeid(*pb).name() << std::endl;
		delete pb;
	}

	{
		A* pa = reinterpret_cast< A* >(new B);
		std::cout << typeid(*pa).name() << std::endl;
		delete pa;
	}

	return 0;
}




Код: plaintext
1.
2.
3.
4.
class A
class AA
class B
class B


Правда это не значит, что она обязана работать везде.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562023
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДа, ты отчасти прав
Но только отчасти. Я забыл включить виртуальную функцию в класс, поэтому оно не работало.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562034
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Да и там ещё не понятно, к какому типу приводить если что...
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562035
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

Код: plaintext
1.
2.
3.
A* pa = reinterpret_cast< A* >(new B);
		std::cout << typeid(*pa).name() << std::endl;
		delete pa;



UB

2 Medvedev_A

делайте общий базовый класс и не гадай на кофейной гуще.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562037
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже интересно стало...

Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
// rtti.cpp : Defines the entry point for the console application.
//

#include <iostream>
#include <typeinfo.h>

struct Polymorphyc 
{ 
	virtual void foo() = 0;
};

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

class AA : public A 
{
};

class B
{
public:
	virtual ~B() {}
};

int main(int argc, char* argv[])
{
	A* pa = new AA;
	B* pb = new B;

	std::cout << typeid(*pa).name() << std::endl;
	std::cout << typeid(*pb).name() << std::endl;

	Polymorphyc *px;
	px = reinterpret_cast<Polymorphyc *>(pa);
	std::cout << typeid(*px).name() << std::endl;
	px = reinterpret_cast<Polymorphyc *>(pb);
	std::cout << typeid(*px).name() << std::endl;

	return 0;
}



Так тоже работает.

С .dll-ями наверняка почти НЕ будет работать.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562038
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковMasterZiv,

Код: plaintext
1.
2.
3.
A* pa = reinterpret_cast< A* >(new B);
		std::cout << typeid(*pa).name() << std::endl;
		delete pa;



UB

Дакажи, что трэуголнык , э ?
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562042
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ziv, кури стандарт.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562044
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Анатолий ШироковMasterZiv,

Код: plaintext
1.
2.
3.
A* pa = reinterpret_cast< A* >(new B);
		std::cout << typeid(*pa).name() << std::endl;
		delete pa;



UB


Не, ну от

Код: plaintext
1.
delete pa;



я готов отказаться...
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562047
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

слушай, не напрягай, а. у тебя "работает" лишь для "примитивных" типов без множественного наследования, ромбовидного наследования и т.п. вещей и понятно почему - ссылка на информацию о типе лежит по известному смещению в таблице виртуальных функций.
...
Рейтинг: 0 / 0
Определение класса по указателю
    #38562051
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

грубо говоря, ты хачишь. почему автору вопроса не легализоваться и сделать общий базовый класс

Код: plaintext
1.
2.
3.
4.
5.
class base {
public:
    virtual ~base() {}
    virtual int classId() const = 0; 
};



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


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