Как создать объект "на лету" по его имени.

Тема в разделе "LANGS.C", создана пользователем crypto, 5 мар 2009.

  1. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Речь идет о создании объекта в run-time по его имени (char*, String) в среде Билдера. Тут по ходу дела понадобилось провести небольшое исследование на эту тему, из которого я уяснил, что люди сабжом интересуются, но предложенные способы не дают окончательного решения. Сразу оговорюсь, что только средствами языка у меня тоже не получилось. Но вот такой трюк может пройти.

    Пусть String: ClassName - имя класса.
    Дальше предполагаем, что класс уже зарегистрирован (иначе ничего не получится), возьмем указатель на VMT (то, что в Билдере называется TMetaClass*):
    TMetaClass* metaClass = GetClass(ClassName);
    if (metaClass)
    {
    //Если метакласс найден, определяем размер класса.
    int objSize = TObject::InstanceSize(metaClass);
    //Выделяем память под экземпляр класса
    TObject* obj = (TObject*)new BYTE[objSize];
    //Иницализируем экземпляр класса
    TObject::InitInstance(metaClass, obj);
    //Присваиваем результат
    result = (TComponent*)obj;
    }

    Такая конструкция мне всретилась в одной из статей, но за бортом остался вопрос: а как же теперь создать сам объект, ведь метод Create недоступен для тех, кто программирует на Билдере? Если рассматривать объекты, произведенные от класса TComponent, можно использовать трюк, связанный с тем, что метод Create для этих классов является виртуальным и его смещение в таблице VMT фиксированное (=0x12).
    Детали не привожу, но поскольку указатель на VMT у нас есть (metaClass), то получить адрес процедуры Create уже ничего не стоит.
    И еще: инициировать новый экземпляр класса можно и немного по-другому: адрес процедуры NewInstance находится тоже в VMT со смещением (-0xC).
     
  2. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    crypto

    Бгы) Педали не жмут?

    http://www.google.com/search?hl=ru&client=opera&rls=ru&hs=FOE&q=%D0%9F%D0%B0%D1%82%D1%82%D0%B5%D1%80%D0%BD+Factory&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=
     
  3. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    _DEN_
    А при чем здесь Жаба?
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    crypto

    Конкретно жаба тут не при чем. То что тебе нужно называется Паттерн "Фабрика". Он реализуется почти в каждом языке, и в каждом языке по-своему. Ищи реализации фабрики на C++ и выбирай наиболее подходящую под твои условия.
     
  5. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    _DEN_
    Дал бы уж ссылку на Gamma или Александреску. :) Там с примерами реализации.
    Хотя Александреску маньяк еще тот. Если с его подходом изучать С++, то его никогда весь не выучишь :-D
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    TermoSINteZ

    Гамма - прошлый век.


    Хм... А с каким подходом нужно его изучать чтобы "весь выучить"? :)
     
  7. varnie

    varnie New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2005
    Сообщения:
    1.785
    _DEN_
    а что тогда по design patterns на д. момент покруче будет?
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    varnie

    Саттер, Александреску, команда разработчиков boost.
     
  9. GoldFinch

    GoldFinch New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2008
    Сообщения:
    1.775
    фабрики которые делают фабрики делающие фабрики...
    ну да....
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    _DEN_
    Мож хватить флеймить. Мы здесь не обсуждаем кто круче, и что прошлый век, ведь так? :)

    //off
    Я здесь имел ввиду, что вот изучаешь, думаешь что уже дофига знаешь в С++, чтоб любую задачу решить, а читая этих авторов, кажется, что по сути то и не знаешь С++ толком...
    Хотя где-то на рсдн 1 чел писал, что таких извращенцев, как Александреску надо с рождения убивать :-D