Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамические объекты. Как получить идентификатор, класса или конкретного объекта 
:(
    Опции темы
np9mi7
  Дата 14.5.2005, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Добрый день.

Тут задался вопросом, как получить в динамике идентификатор класса и объекта, который принадлежит конкретному классу, те есть некий класс:

Код

class CObject
{
           protected:
                        CObject();
           public:
                       vitrual  ~CObject();
                        static stl::string getClassUID();
                        virtual stl::string getObjectUID() = 0;
}


Это класс - базовый, для всех объектов системы. Как реализовать эти функции стандартными средствами с++???

Те существует ли в стандартный набор функций для решения этой задачи?

Заранее благодарен за помощь.


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
chipset
Дата 14.5.2005, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4071
Регистрация: 11.1.2003
Где: Seattle, US

Репутация: 27
Всего: 165



Есть вот кое-что, называемое typeid но базового класса насколько я знаю - нет.



--------------------
Цитата(Jimi Hendrix)
Well, I stand up next to a mountain
And I chop it down with the edge of my hand
PM MAIL WWW   Вверх
Chaos A.D.
Дата 14.5.2005, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 172
Регистрация: 16.1.2005
Где: 09 RUS

Репутация: 6
Всего: 7



А что ты тмеешь ввиду под стандартными средствами? Вариантов узнать класс объекта во время выполнения море. Вопрос в том, что ты имеешь ввиду под стандартными средствами? Без дополнительных расходов вряд-ли получится. Можно заюзать идиому т.н. "объектов класса" из книги Джефа Элджера, которую можно найти в электронном виде сдесь, на сайте. Есть RTTI. Его можно юзать для получения имени класса. Ну а имя класса уже можно применить для индексации ассоциативного массива с более детальной инфой о классе. Например так:

Код

class Foo {};
class Bar : public Foo {};
class Banana : public Bar {};

class ClassInfo
{
    private :
        int x;
        // Инфа, общая для всех объектов.
    public :
        // Интерфейс для получения инфы о классе.

        ClassInfo( int X = 12 ) : x(X) {}
        int GetX( void ) const { return x; }
        void Dump( ostream &out ) const { out << x << endl; }
};

map<string, ClassInfo*> ClassInfoMap;

main()
{
    ClassInfoMap[typeid(Foo).name()] = new ClassInfo(32);
    ClassInfoMap[typeid(Bar).name()] = new ClassInfo(65);
    ClassInfoMap[typeid(Banana).name()] = new ClassInfo(512);

    Bar bar;
    ClassInfoMap[typeid(bar).name()]->Dump(cout);
}

--------------------
Надо смеяться над тем, что тебя мучит, иначе не сохранишь равновесия, иначе мир сведет тебя с ума...Ken Kesey - One Flew Over The Cocoo's Nest
PM MAIL   Вверх
np9mi7
  Дата 15.5.2005, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Ну так вот, решил сделать так:
Код

//---------------------------------------------------------------------------
#include <rpc.h>
#include <typeinfo.h>
//---------------------------------------------------------------------------
class CObject
{
        AnsiString  m_asObjectId;
    protected:
        CObject() throw ();
        AnsiString  getObjectId () const;
        AnsiString  getClassId  () const;
    public:
        virtual ~CObject();
        __property  AnsiString  the_asObjectId  =   {read = getObjectId};
        __property  AnsiString  the_asClassId   =   {read = getClassId};
};
CObject::CObject() throw()
{
    GUID sGUID;UuidCreate(&sGUID);      // генерирую GUID для объекта
    m_asObjectId =  "{ "+               // собираю строку из созданного GUID - а
                            AnsiString (sGUID.Data1) +
                    "-" +   AnsiString (sGUID.Data2) +
                    "-" +   AnsiString (sGUID.Data3) +
                    "-" +   AnsiString (*((unsigned __int64*)sGUID.Data4)) +    // кастование только для того чтоб в                                                                                       
                    " }";//строке число лежало(__int64 - 8 байт)
}
CObject::~CObject()
{
}
AnsiString CObject::getObjectId () const
{
    return m_asObjectId;
}
AnsiString CObject::getClassId  () const
{
    return AnsiString(typeid(*this).name());
}
class CObjectChild : public CObject
{
    public:
        CObjectChild() : CObject(){}
        virtual ~CObjectChild(){};
};


IDE Borland Builder 6.0 ()


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
Vyacheslav
Дата 16.5.2005, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



А не проще для получения строки GUID использовать
Код

extern PACKAGE AnsiString __fastcall GUIDToString(const GUID);



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
np9mi7
Дата 17.5.2005, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia

Репутация: 5
Всего: 10



Проще... Спасибо....


--------------------
"Я точно знаю то, что ничего не знаю..." Сократ.
evolution project
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.