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

Как передавать объект класса в методе main, чтобы конструктор не вызывался 2 раза?

18.11.2016, 12:23. Показов 952. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблемы заключаются в следующем: есть класс для создания записи и класс для хранения массива этих записей. Так вот, как передавать объект класса Note в методе main, чтобы конструктор не вызывался 2 раза (Note *t, и потом в case 1: t = new Note() делать пробывала, но проблему с двумя вызовами конструктора так и не решилась). И проблема с gets_s, не даёт ввести с клавиатуры, пробовала использовать fflush перед этим делом, но всеравно игнорирует! Подскажите пожалуйста в чем дело и как это лучше исправить.

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
#include "stdafx.h"
#include <iostream>
using namespace std;
 
class Note {
private:
    char *FIO;
    int homeNumber;
    int workNumber;
    int mobNumber;
public:
    Note(char *str = "noName", int homeNumber = 0, int workNumber = 0, int mobNumber = 0) : homeNumber(homeNumber), workNumber(workNumber), mobNumber(mobNumber){
        fflush(stdin);
        char a[128];
        cout << "Enter name: ";
        gets_s(a,127);
        FIO = new char[strlen(a)+1];
        strcpy_s(FIO, strlen(a) + 1, a);
        cout << "Enter homeNumber: ";
        cin >> homeNumber;
        cout << "Enter workNumber: ";
        cin >> workNumber;
        cout << "Enter mobNumber: ";
        cin >> mobNumber;
    }
    ~Note() {
        delete[] FIO;
    }
    //Getters
    char *getName() {
        return FIO;
    }
    int getHomeNumber() {
        return homeNumber;
    }
    int getWorkNumber() {
        return workNumber;
    }
    int getMobNumber() {
        return mobNumber;
    }
};
 
class PhoneBook{
private:
    static int count;
    Note *mas = NULL;
public:
    void add(Note obj) {
        if (count==0)
        {
            mas = new Note[1];
            mas[0] = obj;
            count++;
        }
        else
        {
            count++;
            Note *tmp;
            tmp = new Note[count];
            for (int i = 0; i < count-1; i++)
            {
                tmp[i] = mas[i];
            }
            tmp[count - 1] = obj;
            delete[] mas;
            mas = tmp;
        }
    }
    void del() {
        if (count == 0)
        {
            cout << "No note!!!" << endl;
        }
        else
        {
            cout << "Enter FIO abonent for delete: ";
            char str[40];
            int index = -1;
            gets_s(str, strlen(str));
            for (int i = 0; i < count; i++)
            {
                if (strcmp(str,mas[i].getName())==0)
                {
                    index = i;
                }
            }
            if (index<0)
            {
                cout << "Not node for delete!!!" << endl;
            }
            else
            {
                count--;
                Note *tmp;
                tmp = new Note[count];
                for (int i = 0; i < index; i++)
                {
                    tmp[i] = mas[i];
                }
                for (int i = index+1; i < count+1; i++)
                {
                    tmp[i - 1] = mas[i];
                }
                delete[] mas;
                mas = tmp;
            }
        }
    }
    void show() {
        for (int i = 0; i < count; i++)
        {
            cout << "Name: " << mas[i].getName() << ", HomeNumber: " << mas[i].getHomeNumber()
                << ", WorkNumber: " << mas[i].getWorkNumber() << ", MobNumber: " << mas[i].getMobNumber() << endl;
        }
        cout << "================================" << endl;
    }
    void search() {
        cout << "Enter FIO abonent for search: ";
        char str[40];
        int index = -1;
        gets_s(str, strlen(str));
        for (int i = 0; i < count; i++)
        {
            if (strcmp(str, mas[i].getName()) == 0)
            {
                index = i;
            }
        }
        if (index<0)
        {
            cout << "Not node with your name!!!" << endl;
        }
        else
        {
            cout << "Name: " << mas[index].getName() << ", HomeNumber: " << mas[index].getHomeNumber()
                << ", WorkNumber: " << mas[index].getWorkNumber() << ", MobNumber: " << mas[index].getMobNumber() << endl;
        }
    }
};
 
int PhoneBook::count = 0;
 
int main()
{
    PhoneBook mas;
    int punkt = 0;
    do
    {
        cout << "Enter punkt menu (0 - exit): " << endl;
        cout << "1 - add note, 2 - delete not, 3 - search abonent,\n4 - show abonents, 5 - save to file, 6 - load out of file" << endl;
        cin >> punkt;
        switch (punkt)
        {
        case 0: exit(0); break;
        case 1: mas.add(new Note); break;
        case 2: mas.del(); break;
        case 3: mas.search(); break;
        case 4: mas.show();  break;
        case 5: break;
        case 6: break;
        default:
            cout << "Invalid punkt menu!!!" << endl;
            break;
        }
    } while (true);
 
    system("pause");
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2016, 12:23
Ответы с готовыми решениями:

Как передавать значения строкового типа в конструктор через объект класса?
Как передавать значения строкового типа в конструктор через объект класса? Или просто, как передавать знач строкового типа в конструктор? ...

Как вызвать статические методы из класса ConsoleReader в методе Main?
Задание: Сделать класс ConsoleReader, у которого будут 4 статических метода: String readString() – читает с клавиатуры строку int...

Как из класса передавать объект Connection в JSP?
Ja poluchil objeckt Connection-a v classe i xochu peredovat eto v JSP. S pomoshju HttpSession-a tam u menia poluchaetsja null-evoe...

13
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
18.11.2016, 12:31
melanu, используйте конструктор копирования
http://cppstudio.com/post/9903/
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 12:58  [ТС]
Конструктор копирования не решит проблемы с повторными вызовами конструктора, т.к. постоянно идет добовление записей и расширение массива будет происходить вызов конструктора описанного в классе Note.
Нужно убрать из конструктора Note тело и вставить его в функцию add(), других вариантов пока не приходит в голову.
0
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
18.11.2016, 13:29
melanu, а для чего происходит передача объекта типа Note в метод add (класс PhoneBook)? Почему бы не объявить его в самом методе add. И в конструкторе Note имеет место динамическое выделение памяти, поэтому конструктор копирования будет совсем не лишним.
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 13:55  [ТС]
В принципе можно и в самом add, сейчас буду пробывать!

Добавлено через 16 минут
Первая проблема решилась. Осталась проблема с gets_s(str, 127); Почему не дает ввести имя?
0
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
18.11.2016, 14:08
melanu, только заметил, вы же понимаете что запись типа Note *mas = new Note[10], вызовет десять конструкторов, в которых будет требоваться ввести десять раз данные?
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 14:13  [ТС]
Да я уже решила эту проблему, вставила ввод данных в метод Add(); Теперь другая проблема, при очистке старого массива delete[] mas; вылетает прерывание. И метод show не корректно работает, вместо имени выводит иероглифы.
Конструктор копирования реализовала:
C++
1
2
3
4
    Note(const Note &obj) : homeNumber(obj.homeNumber), workNumber(obj.workNumber), mobNumber(obj.mobNumber) {
        FIO = new char[strlen(obj.FIO) + 1];
        strcpy_s(FIO, strlen(obj.FIO) + 1, obj.FIO);
    }
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
void add() {
        fflush(stdin);
        char str[128];
        int hn, wn, mn;
        cout << "Enter name: ";
        //gets_s(str, 127);
        cin >> str;
        cout << "Enter homeNumber: ";
        cin >> hn;
        cout << "Enter workNumber: ";
        cin >> wn;
        cout << "Enter mobNumber: ";
        cin >> mn;
        Note obj(str, hn, wn, mn);
        if (count==0)
        {
            mas = new Note[1];
            mas[0] = obj;
            count++;
        }
        else
        {
            count++;
            Note *tmp;
            tmp = new Note[count];
            for (int i = 0; i < count-1; i++)
            {
                tmp[i] = mas[i];
            }
            tmp[count - 1] = obj;
            delete[] mas;
            mas = tmp;
        }
    }
0
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
18.11.2016, 14:18
Цитата Сообщение от melanu Посмотреть сообщение
delete[] mas;
* * * * * * mas = tmp;
вы удалили массив и затем не выделив новой памяти приравниваете к tmp
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 14:22  [ТС]
Так mas это указатель типа Note, я удаляю старый массив по адресу указателя mas, и затем mas присваиваю указатель типа Note вновь созданного массива. Или я чего то не понимаю?
C++
1
Note *tmp; tmp = new Note[count];
0
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
18.11.2016, 14:27
melanu, https://ru.wikipedia.org/wiki/Delete_(C%2B%2B)
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 15:03  [ТС]
Пробывала так сделать, ошибка вылетает на очистке памяти, в чём может быть данная проблема?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
            count++;
            Note *tmp;
            tmp = new Note[count];
            for (int i = 0; i < count-1; i++)
            {
                tmp[i] = mas[i];
            }
            tmp[count - 1] = obj;
            delete[] mas;
            mas = new Note[count];
            for (int i = 0; i < count; i++)
            {
                mas[i] = tmp[i];
            }
            delete[] tmp;
0
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
18.11.2016, 15:44
melanu, вот ознакомьтесь
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
#include "stdafx.h"
#include <iostream>
#include <cstdio>
 
using namespace std;
 
class Note {
private:
    char FIO[128];// Можно обойтись без динамического выделения памяти
    int homeNumber;
    int workNumber;
    int mobNumber;
public:
    Note() {
        strcpy(FIO,"NoName");//  данные не введены
        homeNumber = -1;// Данные не введены
        workNumber = -1;
        mobNumber = -1;
    }
    // Отдельный метод для ввода данных
    void append() {
        cout << "Enter name: ";
        cin.ignore();
        cin.get(FIO,127);
        cout << "Enter homeNumber: ";
        cin >> homeNumber;
        cout << "Enter workNumber: ";
        cin >> workNumber;
        cout << "Enter mobNumber: ";
        cin >> mobNumber;
    }
 
    // Показать запись
    void show() {
        cout << endl << "Name: "<< FIO << endl;
        cout << "homeNumber: " << homeNumber << endl;
        cout << "workNumber: " << workNumber << endl;
        cout << "mobNumber: " << mobNumber << endl << endl;
    }
 
    //Getters
    char *getName() {
        return FIO;
    }
    int getHomeNumber() {
        return homeNumber;
    }
    int getWorkNumber() {
        return workNumber;
    }
    int getMobNumber() {
        return mobNumber;
    }
};
 
class PhoneBook {
private:
    int count;
    Note *mas;
public:
    PhoneBook() {
        count = 0;
        mas = NULL;
    }
 
    void add() {
        if(count == 0) {
            mas = new Note [1];
            mas[0].append();
            count++;
        }
        else
        {
            count++;
            Note *tmp;
            tmp = new Note [count];
            for (int i = 0; i < count-1; i++)
            {
                tmp[i] = mas[i];
            }
            tmp[count - 1].append();
            delete [] mas;
            mas = new Note [count];
            for(int i = 0; i<count; i++)
                mas[i] = tmp[i];
        }
    }
 
    void del() {
        if(count == 0) {
            cout << "No note!!!" << endl;
            return ;
        }
        else {
            cout << "Enter FIO abonent for delete: ";
            char str[128];
            int index = -1;
            cin.ignore();
            cin.get(str,127);
            for (int i = 0; i < count; i++) {
                if (strcmp(str,mas[i].getName())==0) {
                    index = i;
                }
            }
            if (index<0) {
                cout << "Not node for delete!!!" << endl;
                return ;
            }
            else {
                count--;
                Note *tmp;
                tmp = new Note [count];
                for (int i = 0; i < index; i++) {
                    tmp[i] = mas[i];
                }
                for (int i = index+1; i < count+1; i++) {
                    tmp[i - 1] = mas[i];
                }
 
                delete[] mas;
                Note *mas = new Note[count];
                for(int i = 0; i<count; i++)
                    mas[i] = tmp[i];
            }
        }
    }
    void show() {
        for (int i = 0; i < count; i++)
        {
           mas[i].show();
        }
        cout << "================================" << endl;
    }
 
    void search() {
        cout << "Enter FIO abonent for search: ";
        char str[128];
        int index = -1;
        cin.ignore();
        cin.get(str,127);
        for (int i = 0; i < count; i++)
        {
            if (strcmp(str, mas[i].getName()) == 0)
            {
                index = i;
            }
        }
        if (index<0)
        {
            cout << "Not node with your name!!!" << endl;
        }
        else
        {
            mas[index].show();
        }
    }
};
 
int main()
{
    PhoneBook mas;
    int punkt = 0;
    do
    {
        cout << "Enter punkt menu (0 - exit): " << endl;
        cout << "1 - add note, 2 - delete not, 3 - search abonent,\n4 - show abonents, 5 - save to file, 6 - load out of file" << endl;
        cin >> punkt;
        switch (punkt)
        {
        case 0: exit(0); break;
        case 1: mas.add(); break;
        case 2: mas.del(); break;
        case 3: mas.search(); break;
        case 4: mas.show();  break;
        case 5: break;
        case 6: break;
        default:
            cout << "Invalid punkt menu!!!" << endl;
            break;
        }
    } while (true);
 
    system("pause");
 
    return 0;
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.11.2016, 15:54
Цитата Сообщение от melanu Посмотреть сообщение
void add(Note obj)
C++
1
void add(const Note& obj)
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 16:59  [ТС]
С динамическим FIO такое к сожалению не прокатывает, а нужно именно в динамике хранить name.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.11.2016, 16:59
Помогаю со студенческими работами здесь

Демонстрация возможностей созданного класса в методе Main()
Здравствуйте уважаемые программисты) Мне нужна ваша помощь. Большую часть я уже сделала, осталось чуть чуть. Вот что мне осталось...

Зачем нужно писать 2 раза название класса в методе?
Зачем нужно писать 2 раза название класса в методе? В данном случае класс ThreeD: ThreeD b = new ThreeD(10, 10, 10); //44-ая строка ...

как сделать чтобы объект производного класса сам себя добавлял в список или массив указателей базового класса?
я хотел так, но программа просто падает void Student::add(Base** head) { cout &lt;&lt; &quot;I here&quot; &lt;&lt; endl; this-&gt;setName(); //все...

В конструктор класса передать объект этого класса
Вопрос на засыпку :) Как в конструктор класса передать объект этого класса? Т.е. class A { public: A(const char* s){} ...

Как создать объект класса и использовать его методы, если уже был определен конструктор
Вот код, в нем есть конструктор public Tmas(string path). namespace lab4_OOP { class Tmas { public int a {...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru