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

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


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

Пока суть да дело -- с чего ты решил, что нужен общий предок для этого? каков твой ход мыслей?
...
Рейтинг: 0 / 0
15.02.2014, 22:39
    #38561999
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение класса по указателю
MasterZivДостаточно просто включенного rtti
и как минимум одна виртуальная функция нужна.
...
Рейтинг: 0 / 0
15.02.2014, 22:56
    #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
15.02.2014, 23:11
    #38562023
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение класса по указателю
MasterZivДа, ты отчасти прав
Но только отчасти. Я забыл включить виртуальную функцию в класс, поэтому оно не работало.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.02.2014, 23:25
    #38562034
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение класса по указателю
Dimitry Sibiryakov,

Да и там ещё не понятно, к какому типу приводить если что...
...
Рейтинг: 0 / 0
15.02.2014, 23:32
    #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
15.02.2014, 23:35
    #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
15.02.2014, 23:36
    #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
15.02.2014, 23:42
    #38562042
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение класса по указателю
ziv, кури стандарт.
...
Рейтинг: 0 / 0
15.02.2014, 23:44
    #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
16.02.2014, 00:02
    #38562047
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Определение класса по указателю
MasterZiv,

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

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

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



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


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