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

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

15.04.2016, 23:03. Показов 8847. Ответов 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
17.04.2016, 01:11
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Имеется в виду нечто наподобие такого
C++
1
CObject* c=CRuntimeClass::FromName("MyClass").CreateObject();
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.04.2016, 02:12
Цитата Сообщение от avgoor Посмотреть сообщение
Есть неявные методы в таблице. зачем вводить еще и неявного предка? Не плодите лишних сущностей.
Окей, там неявный интерфейс, который на 100% идентичен абстрактному классу-предку, но другой. Правда, при таких выкладках мне почему-то вспоминается копипаста про фатальный недостаток.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
17.04.2016, 02:37
Renji, Создайте указатель на ваш базовый класс и откастите к нему произвольный объект.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.04.2016, 03:30
Цитата Сообщение от avgoor Посмотреть сообщение
Renji, Создайте указатель на ваш базовый класс и откастите к нему произвольный объект.
А что, C++ RTTI уже работает с произвольным объектом, а не только унаследованным от полиморфного класса?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class RTTIParent
{
public:
};
 
//виртуальные методы есть. Но RTTI это не поможет
class RTTIChild:public RTTIParent
{
public:
    virtual~RTTIChild(){}
};
 
int main(int argc, char *argv[])
{
    RTTIParent* pointer=new RTTIChild;
    cout<<typeid(*pointer).name()<<endl;
    return 0;
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
17.04.2016, 03:55
Цитата Сообщение от Renji Посмотреть сообщение
А что, C++ RTTI уже работает с произвольным объектом, а не только унаследованным от полиморфного класса?
Цитата Сообщение от Renji Посмотреть сообщение
который на 100% идентичен абстрактному классу-предку
Если на 100% идентичен - создайте указатель на него.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.04.2016, 04:10
Цитата Сообщение от avgoor Посмотреть сообщение
Если на 100% идентичен - создайте указатель на него.
Типа, если внутренняя структура класса implementation-defined и он не имеет стандартизированного имени, он уже не класс? Ну, вот такой хак вполне работает. Хотя, прямого доступа к implementation-defined потрохам не дает, да.
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
#include <iostream>
#include<string>
#include<typeinfo>
 
using namespace std;
 
class RTTIParent
{
public:
    virtual~RTTIParent(){}
};
 
class RTTIChild
{
public:
    virtual~RTTIChild(){}
};
 
int main(int argc, char *argv[])
{
    RTTIParent* pointer=(RTTIParent*)new RTTIChild;
    cout<<typeid(*pointer).name()<<endl;
    return 0;
}
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
17.04.2016, 10:09
Цитата Сообщение от Renji Посмотреть сообщение
он уже не класс?
А если в таблице лежит не адрес operator typeid, а просто адрес type_info, тогда как?
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
17.04.2016, 10:21
Цитата Сообщение от avgoor Посмотреть сообщение
А если в таблице лежит не адрес operator typeid, а просто адрес type_info, тогда как?
Тогда вместо виртуальной функции, получаем виртуальную static-константу. Действительно, немного другой механизм, но не сказал бы что принципиально отличающийся.
0
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 2
16.01.2017, 21:23
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public class First //1
    {
      
        int [] a;
      //  int n;
 
        public First(int n) {
 
            a = new int[n];
            Random rand = new Random();
            for (int i = 0; i < n; i++)
            {
                a[i] = rand.Next(-10, 10);
            }
        }
 
        public string Method1(int n) {
 
           
            string s = "";
            for(int i=0; i < n; i++) {
             //  a[i] += sum;
                 s += Convert.ToString(a[i] + " ") + "";
            }
           
            return s;
        }
 
 
        public string Method1()
        {
            int sum = 0;
            string k = "";
            for (int i = 0; i < a.Length; i++)
            {
                sum += a[i];
            }
            k = Convert.ToString(sum);
            return k;
        }
 
 
public partial class Form1 : Form
    {
        public First first;
        public Form1()
        {
            InitializeComponent();
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            int n = Convert.ToInt32(textBox1.Text);
           first = new First(n);
           textBox2.Text = first.Method1(n);
         
 
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
         
            textBox2.Text = first.Method1();
           
        }
    }
Добавлено через 3 минуты
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
namespace Exam
{
    public class First
    {
      
        int [] a;
    
        public First(int n) {
 
            Random rand = new Random();
            a = new int[n];
     
            for (int i = 0; i < n; i++)
            {
                a[i] = rand.Next(-10, 10);
            }
        }
 
   
        public string Method1()
        {
            int sum = 0;
            string k = "";
            for (int i = 0; i < a.Length; i++)
            {
                sum += a[i];
            }
            k = Convert.ToString(sum);
            return k;
 
     
        }
 
       /* public string M()
        {
 
 
            string s = "";
            for (int i = 0; i < a.Length; i++)
            {
 
                s += Convert.ToString(a[i] + " ") + " ";
            }
 
            return s;
        }*/
    }
 
public class Second
    {
          int [] a;
 
        public Second(int n) {
 
            Random rand = new Random();
            a = new int[n];
       
            for (int i = 0; i < n; i++)
            {
                a[i] = rand.Next(-10, 10);
            }
        }
 
        public string Method1() {
 
           
            string s = "";
           for(int i=0; i < a.Length ; i++) {
 
                 s += Convert.ToString(a[i] + " ") + " ";
           }
           
            return s;
        }
 
    }
 
 
 
public partial class Form1 : Form
    {
        public First first;
        public Second second;
        List<First> list1 = new List<First>();
        List<Second> list2 = new List<Second>();
        public int n;
        public int t;
 
        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
 
        }
 
        public Form1()
        {
            InitializeComponent();
            Random rand = new Random();
            n = rand.Next(1,6);
            for (int i = 0; i < n; i++) { 
                list1.Add(new First(rand.Next(10,20)));
                listBox1.Items.Add("1st: " + i);
            }
            for (int i = 0; i < n; i++)
            {
                list2.Add(new Second(rand.Next(10, 20)));
                listBox1.Items.Add("2d: " + i);
            }
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            string l = listBox1.Items[listBox1.SelectedIndex].ToString();
            if (l.Contains("1st: "))
            {
                textBox2.Text = list1[Convert.ToInt32(new string(l[0], 1))].Method1() + "/n" + list1[Convert.ToInt32(new string(l[0], 1))].M();
 
            }
           if(l.Contains("2d: "))
            {
                
                textBox2.Text = list2[Convert.ToInt32(new string(l[0], 1))].Method1();
            }
        }
    }
0
0 / 0 / 0
Регистрация: 16.01.2017
Сообщений: 2
16.01.2017, 22:48
alexakrav97, ryhf
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,026
Записей в блоге: 1
16.01.2017, 23:01
alexakrav97, причем здесь эта тема и c++?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.01.2017, 02:02
Цитата Сообщение от plank Посмотреть сообщение
Грубо говоря как должен выглядеть на плюсах следущий код на шарпе:
паттерн "прототип"

http://rextester.com/LMDV65514

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#include <cassert>
#include <iostream>
#include <string>
#include <vector>
#include <map>
 
 
 
template<class YouInterface> struct TFactory
{
    typedef ::std::string
        Str;
    typedef std::vector<Str>
        RegList;
private:
    struct Base
    {
        virtual ~Base(){}
        virtual YouInterface* Build()const=0;  
    };
 
    template<class T> struct Builder : Base
    { 
        virtual YouInterface* Build()const { return new T; };  
    };
 
    typedef std::map<Str, Base*>
        Map;
    typedef typename Map::const_iterator
        It;
    typedef typename Map::value_type
        ValType;
public:
    TFactory()
        :mData()
    {}
 
    //--- нужна, что бы удалить ассоциацию: символьное_имя <-> тип_класса
    static void Del(const char* key);
    static void Del(const Str& key);
 
    //--- нужна, что бы удалить ассоциацию: символьное_имя <-> тип_класса
    //--- В качестве символьного имени будет использовано имя объекта obj.GetName()
    template<class T> static void Del(const T& obj);
 
    //--- нужна, что бы установить ассоциацию: символьное_имя <-> тип_класса
    template<class T> static void Add(const Str&  key);
    template<class T> static void Add(const char* key);
    
    //--- нужна, что бы установить ассоциацию: символьное_имя <-> тип_класса
    //--- В качестве символьного имени будет использовано имя объекта obj.GetName()
    template<class T> static void Add(const T& obj);
 
    //--- построит объект класса по его символьному имени
    static YouInterface& Build(const Str& key);
 
    //--- вернет список всех зарегистрированных имен
    static RegList GetNames();
 
    //--- true, если указанное имя существует в банке данных
    static bool Exist(const Str&  key);
private:
    static Map& Reg();
 
    Map mData;
};
 
//---------------------------------------------------------------------
//---------------------------------------------------------------------
//---------------------------------------------------------------------
//---------------------------------------------------------------------
 
template<class YouInterface>  
    void TFactory<YouInterface>::Del(const char* key)
    {
        const It it = Reg().find(key);
        if( it==Reg().end() )
            return;
        delete it->second;
        Reg().erase(key);
    }
 
template<class YouInterface>  
    void TFactory<YouInterface>::Del(const Str& key)
        { Del( key.c_str() ); }
 
 
template<class YouInterface>  
    template<class T> 
        void TFactory<YouInterface>::Del(const T& obj)
            { Del(obj.GetName()); }
 
template<class YouInterface>  
    template<class T> 
        void TFactory<YouInterface>::Add(const char* key)
            { Reg().insert( ValType(key, new Builder<T>())  ); }
 
 
template<class YouInterface>  
    template<class T> 
        void TFactory<YouInterface>::Add(const Str& key)
            { Reg().insert( ValType(key, new Builder<T>())  ); }
 
template<class YouInterface>  
    template<class T>
        void TFactory<YouInterface>::Add(const T& obj)
            { Reg().insert( ValType( obj.GetName(), new Builder<T>()) ); }
 
template<class YouInterface>  
    YouInterface& TFactory<YouInterface>::Build(const Str& key)
    {
        const It it = Reg().find(key);
        const bool ERROR_KEY_NOT_EXISTS = it==Reg().end();
        assert(!ERROR_KEY_NOT_EXISTS);
        if(ERROR_KEY_NOT_EXISTS)
            throw ::std::logic_error("ERROR_KEY_NOT_EXISTS");
        return *it->second->Build() ;
    }
 
template<class YouInterface>
    typename TFactory<YouInterface>::RegList 
        TFactory<YouInterface>::GetNames()
        {
            RegList result;
            Map& bd = Reg();
            result.reserve( bd.size() );
            for(It it = bd.begin(); it!=bd.end(); ++it)
                result.push_back(it->first);
            return result;
        }
 
template<class YouInterface>
    bool TFactory<YouInterface>::Exist(const Str& key)
        { return Reg().find(key)!=Reg().end(); }
 
template<class YouInterface>
    typename TFactory<YouInterface>::Map& 
        TFactory<YouInterface>::Reg()
            { static TFactory f; return f.mData; }
 
 
struct sample
{
    virtual ~sample(){}
    virtual void view()const = 0;
};
 
struct foo: sample
{
    virtual void view()const { std::cout << "foo\n"; }
};
 
struct bar: sample
{
    virtual void view()const { std::cout << "bar\n"; }
};
 
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    using factory = TFactory<sample>;
    
    factory::Add<foo>("foo");
    factory::Add<bar>("bar");
    
    factory::Build("foo").view();
    factory::Build("bar").view();
}
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.01.2017, 20:01
Цитата Сообщение от plank Посмотреть сообщение
Ок, а если не "искаропки"? Задача не кажется экзотической, и наверняка должно быть решение.
"Искаропки" такая штука есть в C++ Builder для потомков класса TObject.
А если не из "каропки" то проще сделать свою "каропку" которая генерит RTTI чем в ручную делать и поддерживать в соответствии с кодом таблицы RTTI для решения не "из каропки"
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.01.2017, 21:37
Цитата Сообщение от Renji Посмотреть сообщение
А что, C++ RTTI уже работает с произвольным объектом, а не только унаследованным от полиморфного класса?
нет конечно)
оно вам там парента выведет, а не чаилда жеж)

или вы имеете ввиду оператор typeid ?
этот для полиморфов чекает реальный тип.
для статических - не чекает.
что кстати видно в вашем примере)
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
17.01.2017, 22:29
Цитата Сообщение от plank Посмотреть сообщение
Интроспекция и рефлексия стало быть тоже не нужны?
runtime рефлексия не нужна. compile time нужна
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
17.01.2017, 23:13
Цитата Сообщение от Voivoid Посмотреть сообщение
runtime рефлексия не нужна. compile time нужна
обещали в 17 завести.
ну мож в 30 завезут
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
17.01.2017, 23:38
Цитата Сообщение от Voivoid Посмотреть сообщение
runtime рефлексия не нужна. compile time нужна
Для реализации автоматической полиморфной внешней сериализации/десериализации нужна именно runtime рефлексия и нативные свойства.
Цитата Сообщение от hoggy Посмотреть сообщение
обещали в 17 завести.
ну мож в 30 завезут
Во во. А пора было завести еще в 95-ом. В принципе для компилятора делов то - т.е. фактически нужно словарь парсинга уложить в аккуратненькую табличку в сегменте данных и проставить в VMT указатели на элементы этой таблички.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
18.01.2017, 00:59
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Для реализации автоматической полиморфной внешней сериализации/десериализации нужна именно runtime рефлексия и нативные свойства.
Что это?
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
18.01.2017, 03:27
Цитата Сообщение от Voivoid Посмотреть сообщение
Что это?
Ну к примеру пара функций. Одна иерархию полиморфных объектов в поток засовывает. А вторая обратно из потока высовывает, при этом проверяя совместимость данных в потоке с версией классов скомпилированных в программе.При этом в самих классах чии объекты абсолютно никакого кода для этого писать не надо. То же в принципе нужно для автоматического построения интерфейса визуальных редакторов иерархий объектов (это не формошлепства ради а вместо формошлепства во всяких САПР, левел-эдиторах т.п.).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.01.2017, 03:27
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru