Форум программистов, компьютерный форум CyberForum.ru

Динамическое создание объекта класса - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 68, средняя оценка - 4.91
shadowstar
1 / 1 / 0
Регистрация: 28.02.2012
Сообщений: 20
29.02.2012, 15:16     Динамическое создание объекта класса #1
Примерно что должно получится:

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
#include <iostream>
#include <string>
using namespace std;
class student
{
    string name;
public:
    void y ()
    {
        string temporary;
    cout << "Введите имя\n";
    cin >> temporary;
    name = temporary;
    }
    void Print ()
    {
        cout << name <<endl;
    }
 
}
 
void main ()
{
    int size;
    cout << "Enter the size of the: ";
    cin >> size;
    char temp;
    char *Array = new char[size]();
    for (int j = 1; j < size; j++)
    {
        cout << "Student № " << j <<endl;
        cin >> temp;
                      Array[j] = &temp;
        student temp; // название объекта задает пользователь
    }
    temp.Print (); // здесь ошибка
}
это очень грубая конструкция я знаю и она работать не будет......(((
но она наглядно показывает задачу

а просто хотел узнать как можно так же зделать только правильно (есле можно фрагмент кода с коментариями или что почитать) а то я уже мозг проел с этой конструкцией(((

Добавлено через 20 минут
Тоесть нуна чтоб пользователь ввел например фамилию студента, потом student фамилия; (создание объекта) запись фамилии в динамический массив, а потом вызов метода класса путем извлечения фамилии из динамического массива и использования ее как фамилия.Print ();(метод вывода на экран)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
29.02.2012, 15:34     Динамическое создание объекта класса #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        int size;
        cout << "Enter the size of the: ";
        cin >> size;
        char temp;
        char *Array = new char[size]();
        for (int j = 1; j < size; j++)
        {
                cout << "Student № " << j <<endl;
                cin >> temp;
                      Array[j] = &temp;
                student temp; // название объекта задает пользователь
        }
        temp.Print (); // здесь ошибка
Бредятина.
Скорее всего должно быть что-то такое.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void main( void )
{
  int size;
  cout << "Enter number of students: ";
  cin >> size;
  student *arr = new student[size];
  for (int i = 0; i < size; i++)
  {
    cout << "Insert student №" << i + 1 << ": ";
    cin >> arr[i].name;
  }
  
  cout << "Are in array: \n";
  for (int i = 0; i < size; i++)
     arr[i].Print();
}
Не обещаю, что будет работать, но идея такова.
shadowstar
1 / 1 / 0
Регистрация: 28.02.2012
Сообщений: 20
29.02.2012, 15:37  [ТС]     Динамическое создание объекта класса #3
Цитата Сообщение от darkknight2008 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
        int size;
        cout << "Enter the size of the: ";
        cin >> size;
        char temp;
        char *Array = new char[size]();
        for (int j = 1; j < size; j++)
        {
                cout << "Student № " << j <<endl;
                cin >> temp;
                      Array[j] = &temp;
                student temp; // название объекта задает пользователь
        }
        temp.Print (); // здесь ошибка
Бредятина.
Скорее всего должно быть что-то такое.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void main( void )
{
  int size;
  cout << "Enter number of students: ";
  cin >> size;
  student *arr = new student[size];
  for (int i = 0; i < size; i++)
  {
    cout << "Insert student №" << i + 1 << ": ";
    cin >> arr[i].name;
  }
  
  cout << "Are in array: \n";
  for (int i = 0; i < size; i++)
     arr[i].Print();
}
Не обещаю, что будет работать, но идея такова.
спасибо ща бум думать))))))
darkknight2008
 Аватар для darkknight2008
61 / 61 / 6
Регистрация: 16.10.2011
Сообщений: 200
29.02.2012, 15:42     Динамическое создание объекта класса #4
C++
1
ввел например фамилию студента, потом student фамилия;
Невозможно создать переменную с именем, которое вводит пользователь с клавиатуры.

Добавлено через 4 минуты
Не очел я. cin и cout не могут работать с типом string. Так что советую использовать динамические массивы. Либо работать с тем, что есть. Напиример считывать с клавиатуры в некий буфер, например char buf[100]; а затем присваивать его в переменную типа string
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.02.2012, 15:44     Динамическое создание объекта класса #5
Цитата Сообщение от shadowstar Посмотреть сообщение
Тоесть нуна чтоб пользователь ввел например фамилию студента, потом student фамилия; (создание объекта) запись фамилии в динамический массив, а потом вызов метода класса путем извлечения фамилии из динамического массива и использования ее как фамилия.Print ();(метод вывода на экран)
Дорогой, да Вы никак бредите... Язык С++ компилируемый, а не динамический. Все имена переменных должны быть известны на этапе компиляции, а никак не в рантайме.

Вам надо сделать метод getName() в классе и использовать его для поиска нужного экземпляра.
Можно так же воспользоваться чем-то вроде std::map.

Или я неправильно понимаю поставленную задачу. Опишите изначальную задачу, а не так как Вы ее поняли.
shadowstar
1 / 1 / 0
Регистрация: 28.02.2012
Сообщений: 20
29.02.2012, 15:57  [ТС]     Динамическое создание объекта класса #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int size;
    cout << "Enter number of students: ";
    cin >> size;
    student *arr = new student[size];
    for (int i = 0; i < size; i++)
    {
        cout << "Insert student №" << i + 1 << ": ";
        cin >> arr[i].record_last_name; // выдает ошибку Error: a pointer to a bound function may only be used to call the function
    }
 
    cout << "Are in array: \n";
    for (int i = 0; i < size; i++)
        arr[i].Print();
Добавлено через 3 минуты
Цитата Сообщение от fasked Посмотреть сообщение
Дорогой, да Вы никак бредите... Язык С++ компилируемый, а не динамический. Все имена переменных должны быть известны на этапе компиляции, а никак не в рантайме.

Вам надо сделать метод getName() в классе и использовать его для поиска нужного экземпляра.
Можно так же воспользоваться чем-то вроде std::map.

Или я неправильно понимаю поставленную задачу. Опишите изначальную задачу, а не так как Вы ее поняли.
изначальная задача состоит в том что бы создать группу студентов используя динамический массив
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
#include <iostream>
#include <string>
#include "student.h"
 
 
 
using namespace std;
void main ()
{
    system("mode con cols=70 lines=50");
 
    // вызов конструктора с параметрами
    student Tolik("Pustinskiy", "Tolik", "Aleksandrovich", 26, 1, "Dobrovolskogo 18", "80630514051", 1111, "Programmist");
 
    cout << "Show\n";
    Tolik.Print ();
 
    student tempArray;
 
    cout << "Last name\n";
    tempArray.record_last_name ();
 
    cout << "Name\n";
    tempArray.record_name ();
 
    cout << "Middle name\n";
    tempArray.record_middle_name ();
 
    cout << "Home address\n";
    tempArray.record_home_address ();
 
    cout << "Names of specialization\n";
    tempArray.record_names_of_specialization ();
 
    cout << "Age\n";
    tempArray.record_age ();
 
    cout << "Phone number\n";
    tempArray.record_phone_number ();
 
    cout << "Group number\n";
    tempArray.record_group_number ();
 
    cout << "Sex\n";
    tempArray.record_sex ();
 
    cout << "Show\n";
    tempArray.Print ();
 
}
Добавлено через 35 секунд
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
#pragma once
#include <iostream>
#include <string>
 
using namespace std;
 
class student 
{
    string last_name;
    string name;
    string middle_name;
    int age;
    int sex;
    string home_address;
    string phone_number;
    int group_number;
    string names_of_specialization;
public:
    void record_last_name () // метод_записи_фамилии
    {
        string temporary;
        for (;;)
        {
            getline (cin , temporary);
            if (temporary.empty()){cout << "Empty string\n";continue;}
            else{cout << "Record\n" << endl;break;}
        }
        last_name = temporary;
    }
 
    void record_name () // метод_записи_имени
    {
        string temporary;
        for (;;)
        {
            getline (cin , temporary);
            if (temporary.empty()){cout << "Empty string\n";continue;}
            else{cout << "Record\n" << endl;break;}
        }
        name = temporary;
    }
 
    void record_middle_name () // метод_записи_отчества
    {
        string temporary;
        for (;;)
        {
            getline (cin , temporary);
            if (temporary.empty()){cout << "Empty string\n" <<endl;continue;}
            else{cout << "Record\n" << endl;break;}
        }
        middle_name = temporary;
    }
 
    void record_home_address () // метод_записи_домашнего_адреса
    {
        string temporary;
        for (;;)
        {
            getline (cin , temporary);
            if (temporary.empty()){cout << "Empty string\n" <<endl;continue;}
            else{cout << "Record\n" << endl;break;}
        }
        home_address = temporary;
    }
 
    void record_names_of_specialization () // метод_записи_специализации
    {
        string temporary;
        for (;;)
        {
            getline (cin , temporary);
            if (temporary.empty()){cout << "Empty string\n" <<endl;continue;}
            else{cout << "Record\n" << endl;break;}
        }
        names_of_specialization = temporary;
    }
 
    void record_age () // метод_записи_возраста
    {
        int temporary = 0;
        do
        {
            cin >> temporary;
        }while (temporary < 16 || temporary > 100);
        age = temporary;
    }
 
    void record_phone_number () // метод_записи_телефонного_номера
    {
        string temporary;
        for (;;)
        {
            getline (cin , temporary);
            if (temporary.empty()){cout << "Empty string\n" <<endl;continue;}
            else{cout << "Record\n" << endl;break;}
        }
        phone_number = temporary;
    }
 
    void record_group_number () // метод_записи_номера_группы
    {
        int temporary = 0;
        do
        {
            cin >> temporary ;
        }while (temporary <= 0);
        group_number = temporary;
    }
 
    void record_sex () // метод_записи_пола_студента
    {
        int temporary;
        cout << "1 = man, 2 = women\n";
        do
        {
            cin >> temporary;
        }while (temporary < 1 || temporary > 2);
        sex = temporary;
    };
 
    void Print () // вывод_на_экран_информации_о_студенте
    {
        cout << "Name of the student " << last_name << endl;
        cout << "The student's name " << name << endl;
        cout << "Student's first name " << middle_name << endl;
        cout << "Home address " << home_address << endl;
        cout << "Names_of_specialization " << names_of_specialization << endl;
        cout << "Age of the student " << age << endl;
        cout << "Phone number of the student " << phone_number << endl;
        cout << "Group_number " << group_number << endl;
        if (sex == 1) {cout << "Man\n";}
        else {cout << "Women\n";}
    }
 
    student () // конструктор_класса
    {
        last_name = "NULL";
        name = "NULL";
        middle_name = "NULL";
        age = 0;
        sex = 1;
        home_address = "NULL";
        phone_number = "NULL";
        group_number = 0;
        names_of_specialization = "NULL";
    }
 
    student (char *last_name_2, char *name_2, char *middle_name_2, int age_2, int sex_2, char *home_address_2, char *phone_number_2,
        int group_number_2, char *names_of_specialization_2)  // конструктор с параметрами
    {
        last_name = last_name_2;
        name = name_2;
        middle_name = middle_name_2;
        age = age_2;
        sex = sex_2;
        home_address = home_address_2;
        phone_number = phone_number_2;
        group_number = group_number_2;
        names_of_specialization = names_of_specialization_2;
    }
 
    ~student (void){}; // деструктор_класса
 
 
};
класс студент


 Комментарий модератора 
Используйте соответствующие теги для форматирования кода. Если Вы пишете на языке C++, то и код надо обрамлять тегами CPP.


Добавлено через 3 минуты
не могу понять как создать массив студентов если для добавления информации о студенте нужен объект который нужно создать(( использовать уже готовые не годится...я же не знаю какие у студентов будут фамилии((

а задача // создать группу студентов (динамический массив), отобразить данные на экран.

Добавлено через 2 минуты
сори за теги......я у вас недавно на форуме..... и на форумах вообще.........будем исправлять))
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
29.02.2012, 15:58     Динамическое создание объекта класса #7
Цитата Сообщение от shadowstar Посмотреть сообщение
изначальная задача состоит в том что бы создать группу студентов используя динамический массив
Использование динамического массива подразумевает выделение памяти с помощью оператора new (и освобождение с помощью delete). А также использование циклов для обращения ко всем элементам массива последовательно:
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
void main ()
{
        system("mode con cols=70 lines=50");
 
        // выделяем память под массив из 10 элементов
        int size = 10;
        student *array = new student [size];
 
        // заполняем массив
        for (int i = 0; i < size; ++i)
        {
           cout << "Last name\n";
           array[i].record_last_name ();
    
           cout << "Name\n";
           array[i].record_name ();
    
           cout << "Middle name\n";
           array[i].record_middle_name ();
    
           cout << "Home address\n";
           array[i].record_home_address ();
    
           cout << "Names of specialization\n";
           array[i].record_names_of_specialization ();
    
           cout << "Age\n";
           array[i].record_age ();
    
           cout << "Phone number\n";
           array[i].record_phone_number ();
    
           cout << "Group number\n";
           array[i].record_group_number ();
    
           cout << "Sex\n";
           array[i].record_sex ();
        }
        
        // выводим массив на экран
        cout << "Show\n";
        for (int i = 0; i < size; ++i)
        {
           array[i].Print ();
        }
        
        // удаляем массив
        delete [] array;
}
shadowstar
1 / 1 / 0
Регистрация: 28.02.2012
Сообщений: 20
29.02.2012, 16:01  [ТС]     Динамическое создание объекта класса #8
Цитата Сообщение от fasked Посмотреть сообщение
Использование динамического массива подразумевает выделение памяти с помощью оператора new (и освобождение с помощью delete). А также использование циклов для обращения ко всем элементам массива последовательно:
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
void main ()
{
        system("mode con cols=70 lines=50");
 
        // выделяем память под массив из 10 элементов
        int size = 10;
        student *array = new student [size];
 
        // заполняем массив
        for (int i = 0; i < size; ++i)
        {
           cout << "Last name\n";
           array[i].record_last_name ();
    
           cout << "Name\n";
           array[i].record_name ();
    
           cout << "Middle name\n";
           array[i].record_middle_name ();
    
           cout << "Home address\n";
           array[i].record_home_address ();
    
           cout << "Names of specialization\n";
           array[i].record_names_of_specialization ();
    
           cout << "Age\n";
           array[i].record_age ();
    
           cout << "Phone number\n";
           array[i].record_phone_number ();
    
           cout << "Group number\n";
           array[i].record_group_number ();
    
           cout << "Sex\n";
           array[i].record_sex ();
        }
        
        // выводим массив на экран
        cout << "Show\n";
        for (int i = 0; i < size; ++i)
        {
           array[i].Print ();
        }
        
        // удаляем массив
        delete [] array;
}
аааааааааааааааааааааааааааааа ЗЛО)))) спасибо
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
23.05.2015, 00:44     Динамическое создание объекта класса #9
А может кто подсказать. По лабораторной есть задание тоже создать динамический объект класса. Принцип я понял,создал.Но,в методичке по лабораторной указано,инициализировать объект путем через нотацию "->" и приведен пример с инициализацией 1го элемента и все. Я не могу понять а как остальные то инициализировать? Указавая индекс не помогает,вылетает ошибка.Подскажите плиз.Например вот инициализация через точку и индекс массива,а мне нужно через "->".
C++
1
2
3
4
5
  Samolet *sml;
  sml=new Samolet[3];
  sml[0].vvod("AN","18","Russia","bronirovanni",2000);
  sml[1].vvod("IL","52","Russia","passagirskii",3000);
  sml[2].vvod("Ty","144","Russia","istribitel",4000);
Дан пример вот так и все
C++
1
2
3
 Samolet *sml;
 sml=new Samolet[3];
 sml->vvod("AN","18","Russia","bronirovanni",2000);
А как инициализировать два других элемента??И интересно еще какой элемент из 3ех инициализируется то...
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,586
23.05.2015, 00:57     Динамическое создание объекта класса #10
Цитата Сообщение от System16v Посмотреть сообщение
А как инициализировать два других элемента?
C++
1
2
3
sml->vvod("AN","18","Russia","bronirovanni",2000);
(sml + 1)->vvod("IL","52","Russia","passagirskii",3000);
(sml + 2)->vvod("Ty","144","Russia","istribitel",4000);
Цитата Сообщение от System16v Посмотреть сообщение
И интересно еще какой элемент из 3ех инициализируется то
Первый.
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
23.05.2015, 01:08     Динамическое создание объекта класса #11
DrOffset, спасибо .Сейчас попробую. Ведь точно...,по книге вспомнил что читал же об этом ,вот же память короткая...Из-за того что не пользовался нотацией этой,из головы вылетело
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,586
23.05.2015, 01:08     Динамическое создание объекта класса #12
Цитата Сообщение от System16v Посмотреть сообщение
Есть идеи?Через индекс не хочет,а по другому я что-то вообще не могу сообразить как
А выше я для кого написал код?
System16v
 Аватар для System16v
3 / 3 / 0
Регистрация: 19.02.2014
Сообщений: 115
23.05.2015, 01:11     Динамическое создание объекта класса #13
DrOffset, Не заметил сначала ,еще раз спасибо
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2015, 01:15     Динамическое создание объекта класса
Еще ссылки по теме:

C++ Реализовать создание объекта класса с нужными параметрами
Создание объекта класса из потока C++
C++ Создание объекта класса

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

Или воспользуйтесь поиском по форуму:
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,586
23.05.2015, 01:15     Динамическое создание объекта класса #14
System16v, тут можно добавить, что запись var[index] (в случае, если речь не идет о перегрузке оператора []) - это синтаксический сахар для записи *(var + index).
Yandex
Объявления
23.05.2015, 01:15     Динамическое создание объекта класса
Ответ Создать тему
Опции темы

Текущее время: 14:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru