Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
_Lindenii
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 2
1

Перегрузка оператора ввода для класса с динамическими данными

25.10.2016, 19:52. Просмотров 362. Ответов 3
Метки нет (Все метки)

Доброго времени суток, помогите пожалуйста разобраться с перегрузкой оператора ввода. Есть такой класс
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class TR
{
    char* nametr;
    char* direction;
    float cost;
    int sale;
    char* familiya;
 
public:
    void setnametr(char *);
    void setdirection(char *);
    void setcost(float );
    void setsale(int);
    void setfamiliya(char *);
...
 
 friend ostream& operator<<( ostream&, const TR );
 
 friend istream& operator>> ( istream& , TR& );
....
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
istream& operator>> ( istream& is, TR& tr )
{
    fflush(stdin);
    cout << " Название тренинга : "; 
    is >>tr.nametr;
    cout << " Направленность: "; 
    is >> tr.direction;
    cout << "Стоимость: "; 
    is>> tr.cost;
    cout << "  Скидка : "; 
    is>> tr.sale;
    cout << " Оратор : "; 
    is>> tr.familiya;
    return is;
}
...
Рабочий пример заполнения данными, но без перегрузки оператора ввода.

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
int main() {
    int n = 1, i = 0;
    float summa=0;
    TR *mas;
    mas = new TR[n];
 
        switch (menu())
        {
        case 1:{
 
            string temp;
            cout << "name of trainig: "; 
            getline(cin, temp); 
            if (temp.length() == 0) { getline(cin, temp); }
            char * temp1 = new char[temp.length()];
            strcpy(temp1, temp.c_str());
            mas[i].setnametr(temp1);
            temp.clear(); 
 
            cout << "direction: ";
            getline(cin, temp);
            if (temp.length() == 0) { getline(cin, temp); }
            char * temp2 = new char[temp.length()];
            strcpy(temp2, temp.c_str());
            mas[i].setdirection(temp2);
            temp.clear();
 
            float tempfloat=0;
            cout << "cost: ";
            cin>>tempfloat;
            mas[i].setcost(tempfloat);
 
            int tempint1=0;
            cout << "sale: ";
            cin>>tempint1;
            mas[i].setsale(tempint1);
 
            cout << "familiya of orator: ";
            getline(cin, temp);
            if (temp.length() == 0) { getline(cin, temp); }
            char * temp4 = new char[temp.length()];
            strcpy(temp4, temp.c_str());
            mas[i].setfamiliya(temp4);
            temp.clear();
 
            cout<<"\nДля выхода из программы нажмите 11"<<endl;
            cout<<"Ваш выбор:  ";
            _getch();
 
            i++;
            if (i == n)
            {
                n++;
                TR * temp = new TR[n];
                for (int u = 0; u < i; u++)
                {
                    temp[u] = mas[u];
                }
                mas = temp;
            }
            system("cls");
            break;
               }
...
Перегрузка оператора вывода работает cout<<mas[i] . Но с вводом борюсь уже несколько дней и не получается (в лучшем случае, работает только на перезапись данных). Подскажите, как правильно выделить память под вводимый массив и при этом задействовать перегруженный оператор ввода cin>>mas[i]?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.10.2016, 19:52
Ответы с готовыми решениями:

Перегрузка оператора ввода вне класса
вечер добрый. можно ли так делать? #include &lt;iostream&gt; struct point { int x, y; }; ...

Перегрузка оператора >> для дочернего класса от базового виртуального класса
Доброго вам времени суток! Программирую на С++ не давно, в связи с отсутствием должного времени на...

Перегрузка оператора для класса
Здравствуйте! Подскажите, пожалуйста, почему так не работает: class ClassA { public: ...

Перегрузка оператора + для класса Date
Здравствуйте! Как правильно перегрузить оператор +(Date, int) для класса Date, чтобы дата...

Перегрузка оператора -> для шаблонного класса
Здравствуйте! Возникла проблема: не могу додуматься как перегрузить оператор -&gt; так, чтобы он...

3
nd2
3100 / 2594 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
25.10.2016, 20:20 2
Обязательно нужны char* в классе? На string нельзя заменить? Или просто на массивы char?
0
_Lindenii
0 / 0 / 0
Регистрация: 08.11.2015
Сообщений: 2
25.10.2016, 21:54  [ТС] 3
По требованию преподавателя нужно использовать char*
0
nd2
3100 / 2594 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
25.10.2016, 22:38 4
Знаешь, если использовать логику твоего кода, то заменить то, что делается в case на оператор ввода несложно. Переносишь всё что до i++ в оператор ввода, меняешь там mas[i] на tr, ввод в числа меняешь на такой: (cin>>tempfloat).get();, хотя для чисел можно сразу делать ввод в поле класса, без выделения временной переменной и вызова set(): (cin >> tr.cost).get();, да и для выделения памяти под строки необязательно использовать временный указатель, можно сразу под указатель в классе выделять и копировать туда string, а в case, то что перенёс в оператор ввода, заменяешь этим:
C++
1
cin >> mas[i];
Добавлено через 6 минут
Да, и if (i == n), с телом, нужно вынести в начало case, чтобы память перевыделялась при следующих заходах в case, а не раньше.

Добавлено через 10 минут
И перед mas = temp; нужно старую память освободить:
C++
1
delete [] mas;
0
25.10.2016, 22:38
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2016, 22:38

Перегрузка оператора- для шаблона класса
Ребят подскажите что не так я делаю или подтолкните в нужное русло =\ З.Ы. Массивы будем...

Перегрузка оператора ( ) для объектов класса
Здравствуйте! перегрузили оператор (). Каким образом компилятор поймет где мы вызываем оператор...

Перегрузка оператора += для класса date
Вот код.Я просто не могу вкурить какую проверку воткнуть date &amp; date::operator+=(date &amp; da) {...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.