Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Опрос имени класса у обьекта ...


Автор: sergejzr 18.3.2004, 00:17
Как реализовать возможность опроса имени класса у обьекта в С++?
  • Желательно, что бы компилер сан бы генерил мембера 'name' в классах.
  • Возможен один родитель для всех классов.
  • Необходимо, что бы работало на Юникс/Виндовс(Релиз/Дибаг).
Будут предложения?
Спасибо!



Добавлено @ 00:25
Цитата

Необходимо, что бы работало на Юникс/Виндовс(Релиз/Дибаг).

Я имел в виду конечно gcc/MSVC biggrin.gif

Автор: Coocky 18.3.2004, 00:26
Я че-то не понял
Цитата
Желательно, что бы компилер сан бы генерил мембера 'name' в классах.
Возможен один родитель для всех классов.
Необходимо, что бы работало на Юникс/Виндовс(Релиз/Дибаг

это вопросы или задачи?
Я никогда не слышал,что б обьект предналежал нескольким классам notify.gif
Цитата
Возможен один родитель для всех классов

Если ошибаюсь,буду учить Турбо Паскаль biggrin.gif

Автор: sergejzr 18.3.2004, 00:45
To Coocky
Цитата

это вопросы или задачи?

скорее соображения.

По пунктам:
1:
Цитата

Желательно, что бы компилер сан бы генерил мембера 'name' в классах

если возможно заставить компилер генерить мембера, то вопрос исчерпан.
2:
Цитата

Возможен один родитель для всех классов.

Сознаюсь, пункт излишен, если разберёмся с пунктом 1.
(Имелось в виду, что "дети" унаследуют возможность родителя)
3:
Цитата

Необходимо, что бы работало на Юникс/Виндовс(Релиз/Дибаг).

это условие

Автор: srd 18.3.2004, 01:38
Читай доки по следующим понятиям: typeid, dynamic_cast, type_info. Всё уже придуманно и велосипед изобретать не надо wink.gif

Автор: sergejzr 18.3.2004, 02:21
Дорогой srd, сердечное спасибо!

Кому надо вот пример. проверен на WIN, SUN, AIX

Цитата

#include "stdlib.h"
#include "stdio.h"

#ifdef  _WIN32
#include "typeinfo.h"
#else
#include <typeinfo>
#endif


class XY
{
public:
  XY(){}

  const char* name()
  {
   return typeid( this ).name();
   //return typeid( *this ).name();
  }
};


int main(int argc,char**argv)
{
int a,b;
XY pb;

printf("name='%s'\n",typeid( pb ).name() );
//Даже указатель видно. Какая красота!
printf("name='%s'\n",pb.name() );

return 0;
}

PS:Вообще то я ничего изобретать не собирался..
Просто подозревал, что истина где то рядом biggrin.gif

Автор: OlegsDP 18.3.2004, 14:37
К сожалению, не все так радужно:

Код

#include <stdio.h>
#include <typeinfo.h>

class XY
{
 public:
   XY(){};
 public:
   const char* name()
   {
     return typeid( this ).name();
   }
};

class XY1 : public XY
{
 public:
   XY1(){};
};

void main ()
{
 XY a;
 XY1 b;

 printf("name='%s'\r\n",a.name() );
 printf("name='%s'\r\n",b.name() );
}


распечатывает:

Код

name = 'class XY *'
name = 'class XY *'


Таким образом, наследовать класс, умеющий возвратить свое имя, бесполезно, т.к. он всегда будет возвращать СВОЕ имя, а не класса, его наследующего. Это потому, что typeid - это не функция, а всего-навсего директива компилятора, такая же как sizeof.

Автор: sergejzr 18.3.2004, 15:35
To OlegsDP
Цитата

typeid - это не функция, а всего-навсего директива компилятора

Это ясно, но мне хватит и этого.
Главное, что понятно, где копать smile.gif
Спасибо за заметку.



Автор: FreshMeat 18.3.2004, 19:41
Цитата
Это потому, что typeid - это не функция, а всего-навсего директива компилятора, такая же как sizeof.

Что такое директива компилятора?
typeid и sizeof - это ключевые слова. см. 2.11/1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)