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

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

15.04.2016, 23:03. Показов 9177. Ответов 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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 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 / 1575 / 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 / 1575 / 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 / 1575 / 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
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru