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

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

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

Author24 — интернет-сервис помощи студентам
Проблемы заключаются в следующем: есть класс для создания записи и класс для хранения массива этих записей. Так вот, как передавать объект класса 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.11.2016, 12:23
Ответы с готовыми решениями:

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

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

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

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

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

Добавлено через 16 минут
Первая проблема решилась. Осталась проблема с gets_s(str, 127); Почему не дает ввести имя?
0
109 / 108 / 74
Регистрация: 18.11.2013
Сообщений: 304
18.11.2016, 14:08 6
melanu, только заметил, вы же понимаете что запись типа Note *mas = new Note[10], вызовет десять конструкторов, в которых будет требоваться ввести десять раз данные?
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 14:13  [ТС] 7
Да я уже решила эту проблему, вставила ввод данных в метод 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 8
Цитата Сообщение от melanu Посмотреть сообщение
delete[] mas;
* * * * * * mas = tmp;
вы удалили массив и затем не выделив новой памяти приравниваете к tmp
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 14:22  [ТС] 9
Так 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 10
melanu, https://ru.wikipedia.org/wiki/Delete_(C%2B%2B)
0
1 / 1 / 0
Регистрация: 10.03.2012
Сообщений: 120
18.11.2016, 15:03  [ТС] 11
Пробывала так сделать, ошибка вылетает на очистке памяти, в чём может быть данная проблема?
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 12
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
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
18.11.2016, 15:54 13
Цитата Сообщение от 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  [ТС] 14
С динамическим FIO такое к сожалению не прокатывает, а нужно именно в динамике хранить name.
0
18.11.2016, 16:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2016, 16:59
Помогаю со студенческими работами здесь

Зачем нужно писать 2 раза название класса в методе?
Зачем нужно писать 2 раза название класса в методе? В данном случае класс ThreeD: ThreeD b = new...

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

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

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru