Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/41: Рейтинг темы: голосов - 41, средняя оценка - 4.90
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 6

Создание объекта по имени класса

15.04.2016, 23:03. Показов 9045. Ответов 38
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, собственно вопроса три:

1) Как называется тип класса (то что в шарпе наззывается Type, и откуда его инклюдить)
2) Как зная имя класса получить ссылку на класс
3) Как имея ссылку на класс создать его инстанс (тоесть шаблоны тут не помогут)

Грубо говоря как должен выглядеть на плюсах следущий код на шарпе:

C#
1
2
3
4
5
object createInstance(string typename) 
{
    Type type = Type.GetType(typename);
    return Activator.CreateInstance(type);
}
Заранее благодарю за ответы.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2016, 23:03
Ответы с готовыми решениями:

Возможно ли создание объекта шаблонного класса в функции этого класса?
Доброго времени суток, уважаемые форумчане :) Мне по лабам задали задание - реализовать шаблон контейнера (множество) с операциями...

Создание объекта класса с полем являющимся объектом другого класса
Bill a; cin>>a;//тут я ввел с помощью перегруженного оператора ElementSpiska c; //поля у Spiska(Bill A,int,string,int) ...

Как получить полный адрес по имени поля объекта класса
как получить полный адрес по имени поля объекта класса ? не пересчитывая размер расположенных до него полей от начала объекта

38
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
16.04.2016, 02:52
plank,
0) В C++ "искаропки" нет RTTI (и не будет в том виде в котором она есть в C#). Поэтому:
1) Самый близкий аналог - typeid() НО он не поможет создать экземпляр класса во время выполнения.
2) Никак, т.к. ссылка может быть на экземпляр класса, а не на класс, см 0).
3) Никак, см. п. 2.
0
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 6
16.04.2016, 03:58  [ТС]
avgoor
В C++ "искаропки" нет RTTI (и не будет в том виде в котором она есть в C#).
Ок, а если не "искаропки"? Задача не кажется экзотической, и наверняка должно быть решение.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.04.2016, 05:00
Цитата Сообщение от plank Посмотреть сообщение
Ок, а если не "искаропки"? Задача не кажется экзотической, и наверняка должно быть решение.
Собрать на коленке фабрику объектов. Правда, нужные классы придется вписать ручками.
C++
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
#include <iostream>
#include<functional>
#include<map>
#include<string>
 
class Parent
{
public:
    virtual void print(){std::cout<<"Parent";}
    int x;
};
 
class Child:public Parent
{
public:
    void print(){std::cout<<"Child";}
    int y;
};
 
int main(int argc, char *argv[])
{
    std::map<std::string,std::function<Parent*()> >factory={
        {"Parent",[](){return new Parent;}},
        {"Child",[](){return new Child;}}
    };
 
    Parent*object=factory["Child"]();
    object->print();
    return 0;
}
PS В таком виде нужно C++11.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
16.04.2016, 12:37
Цитата Сообщение от plank Посмотреть сообщение
Ок, а если не "искаропки"? Задача не кажется экзотической, и наверняка должно быть решение.
Решение вам описал Renji я лишь объясню, почему в C# это есть, а в C++ нет и быть не может.
В C# все может быть откастовано в Object в C++ - нет такого общего предка за ненадобностью, т.к. он (да и в общем информация о типах) нужен, в основном, для сборщика мусора, который в C++ - моветон.
0
0 / 0 / 0
Регистрация: 15.04.2016
Сообщений: 6
16.04.2016, 19:49  [ТС]
Интроспекция и рефлексия стало быть тоже не нужны?
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
16.04.2016, 22:05
Цитата Сообщение от plank Посмотреть сообщение
Интроспекция и рефлексия стало быть тоже не нужны?
По философии C++ важнее всего скорость и простота реализации, т.е. да, не нужны.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.04.2016, 23:15
Цитата Сообщение от avgoor Посмотреть сообщение
В C# все может быть откастовано в Object в C++ - нет такого общего предка за ненадобностью
Привязка RTTI к наличию в классе виртуальных функций как бы намекает нам, что общий предок де-факто есть как минимум у полиморфных объектов. И именно через виртуальные методы этого предка RTTI и работает. Другое дело, что прямого доступа к этому предку нет, да и возможности им предоставляемые действительно скудны. Вон, даже, имя класса получаемое через typeid не стандартизировано.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
16.04.2016, 23:21
Цитата Сообщение от Renji Посмотреть сообщение
общий предок де-факто есть как минимум у полиморфных объектов.
Не факт что он есть. В принципе, для RTTI достаточно адреса таблицы виртуальных методов.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
16.04.2016, 23:28
Цитата Сообщение от avgoor Посмотреть сообщение
Не факт что он есть. В принципе, для RTTI достаточно адреса таблицы виртуальных методов.
В принципе то, конечно, достаточно. Но если опираться только на адрес, то typeid будет работать через typeid_table[object->addressOfVirtualTable]. Если же опираться на виртуальные функции, то через object->_typeid(). По-моему, достаточно очевидно что разработчики выберут второй вариант.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
16.04.2016, 23:55
Цитата Сообщение от Renji Посмотреть сообщение
достаточно очевидно что разработчики выберут второй вариант
Microsoft выбрал первый:
C++
1
2
3
4
5
6
7
8
9
class Foo {
public:
    virtual ~Foo() {};
};
 
int main()
{
    std::cout << sizeof(Foo) << std::endl;
}
вывод: 4
Т.е. объект состоит из одного указателя.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.04.2016, 00:03
Цитата Сообщение от avgoor Посмотреть сообщение
Т.е. объект состоит из одного указателя.
А кто вам сказал что наличие предка влияет на размер потомка? Предок имеющий только виртуальные методы (чистый интерфейс) влияет только на размер таблицы виртуальных методов. А он в счет размера объекта не идет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class RTTIParent
{
public:
    virtual std::string _typename()const{return "Parent";}
};
 
class RTTIChild:public RTTIParent
{
public:
    std::string _typename()const{return "RTTIChild";}
};
 
class NoRTTIChild
{
public:
    virtual std::string _typename()const{return "NoRTTIChild";}
};
 
int main(int argc, char *argv[])
{
    cout<<sizeof(RTTIChild)<<" "<<sizeof(NoRTTIChild)<<endl;
    return 0;
}
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.04.2016, 00:10
Цитата Сообщение от avgoor Посмотреть сообщение
В C++ "искаропки" нет RTTI (и не будет в том виде в котором она есть в C#). Поэтому:
В С++ RTTI "из коробки" есть только в C++ Builder, но и то не для всех в только для потомков TObject.
Ну и для того чтобы через __classid создавать все равно этот класс прийдется регистрировать.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
17.04.2016, 00:21
Цитата Сообщение от Renji Посмотреть сообщение
А кто вам сказал что наличие предка влияет на размер потомка?
А на основании чего можно судить о его наличии? Если что-то никак себя не проявляет, по мнению позитивистской науки его нет. Даже если в таблице виртуальных методов есть неявный operator typeid() - это не говорит о наличии предка. Есть неявный конструктор по умолчанию - это тоже какой-то предок?

Добавлено через 3 минуты
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
В С++ RTTI "из коробки" есть только в C++ Builder
Вы ошибаетесь. Похожие механизмы много где есть, в т.ч. в MFC.
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
только для потомков TObject.
О чем и речь. К тому же это не поможет создать произвольного потомка.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.04.2016, 00:22
Цитата Сообщение от avgoor Посмотреть сообщение
Есть неявный конструктор по умолчанию - это тоже какой-то предок?
Ни о неявном конструкторе, ни о виртуальном деструкторе никто кроме компилятора не знает. И вообще, кто чей потомок после компиляции остается разве что в таблицах RTTI коих e C++ кроме C++ Builder нету, да и в С++ Builder они есть только для избранных.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.04.2016, 00:27
Цитата Сообщение от avgoor Посмотреть сообщение
А на основании чего можно судить о его наличии? Если что-то никак себя не проявляет, по мнению позитивистской науки его нет. Даже если в таблице виртуальных методов есть неявный operator typeid() - это не говорит о наличии предка. Есть неявный конструктор по умолчанию - это тоже какой-то предок?
Если в таблице виртуальных методов есть неявный operator typeid(), значит там есть RTTI интерфейс. А интерфейс в C++ как раз и реализуется через абстрактный класс не содержащий никаких данных. Если что-то выглядит как утка и крякает как утка, вероятно, это утка. Если что-то ведет себя как наследник абстрактного класса, вероятно, это и есть наследник абстрактного класса.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
17.04.2016, 00:28
Fulcrum_013, Вы что продаете этот Builder что ли? Что ни тема вы про свой borland.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.04.2016, 00:34
Цитата Сообщение от avgoor Посмотреть сообщение
К тому же это не поможет создать произвольного потомка
там можно по __classid создавать.
Цитата Сообщение от avgoor Посмотреть сообщение
Похожие механизмы много где есть, в т.ч. в MFC.
Похожие механизмы - это - энумерация всех RTTI классов (в том числе инстанционированных шаблонов) , энумерация для каждого класса всех свойств из секций __published и __automated (по ключу компилятора и для private public и protected) с типами геттерами и сеттерами, получение адреса/обращени метода/поля по символьному имени, получение информации о наследовании, получение метакласса и classid, создание инстанса по __classid

Добавлено через 28 секунд
Цитата Сообщение от avgoor Посмотреть сообщение
Вы что продаете этот Builder что ли? Что ни тема вы про свой borland.
Дак что ни тема так везде нету а в билдере есть

Добавлено через 4 минуты
Цитата Сообщение от avgoor Посмотреть сообщение
О чем и речь.
Ну как бы пока не внесут RTTI в стандарт то и будут саму информацию из таблиц заложенных компилятором получать через метод какого нибудь объекта. А кто метод не имеет тот и к таблицам не ходит.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
17.04.2016, 00:47
Цитата Сообщение от Renji Посмотреть сообщение
Если что-то ведет себя как наследник абстрактного класса, вероятно, это и есть наследник абстрактного класса.
Есть неявные методы в таблице. зачем вводить еще и неявного предка? Не плодите лишних сущностей.

Добавлено через 9 минут
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
создание инстанса по __classid
Так и в MFC можно.
СObject::GetRuntimeClass();
CRuntimeClass::CreateObject();
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.04.2016, 01:03
Цитата Сообщение от avgoor Посмотреть сообщение
Так и в MFC можно.
СObject::GetRuntimeClass();
CRuntimeClass::CreateObject();
Имеется в виду нечто наподобие такого:
C++
1
    Application->CreateForm(__classid(TForm5), &Form5);
При этом сам __classid получаем и по имени при энумерации списка классов.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.04.2016, 01:03
Помогаю со студенческими работами здесь

Создание объекта класса в методе этого же класса
собственно вопрос. можно ли создавать объект класса в методе того же класса? насколько это правильно и как это можно сделать (если это...

Создание объекта класса
Есть такой класс: class CSomeClass { public: void SomeMethod(); }; И вот как можно создать объект этого класса:

Создание объекта класса
Я пишу программу, и столкнулся с одной проблемой. Суть следующая. Ниже прикрепил примерную схему иерархии классов. Невозможно сказать,...

Создание объекта класса
Здравствуйте, подскажите пожалуйста в чем разница между Test t(блаблабла); и Test *t = new Test(блаблабла); Я так понимаю что...

Создание объекта класса
Как можно создать объект класса вне функции int main()? Допустим у меня есть 4 файла myclas.h class Humans{ private: string name;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru