0 / 0 / 1
Регистрация: 05.09.2016
Сообщений: 55
1

Перегрузка операций += и -=

05.06.2017, 15:03. Показов 1142. Ответов 8
Метки нет (Все метки)

Объясните, пожалуйста, как правильно выполнить перегрузку операций += и -=? При такой реализации программа вылетает после ввода b.
bottle.h
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
#ifndef BOTTLE_H_
#define BOTTLE_H_
#include <iostream>
class Port {
private:
    char * brand;
    char style[20];     // tawny, ruby, vintage
    int bottles;
public:
    Port(const char * br = "NONE", const char * st = "NONE", int b = 0);
    Port(const Port & p);
    virtual ~Port() {   delete [] brand;    }
    Port & operator=(const Port & p);
    Port & operator+(int b);    // add b to bottles
    Port & operator-=(int b);   // del b from bottles, if it's possible
    int BottleCount() { return bottles; }
    virtual void Show() const;
    friend std::ostream & operator<<(std::ostream & os, const Port & p);
};
class VintagePort : public Port {
private:
    char * nickname;    //"The Noble" or "Old Velvet"
    int year;           
public:
    VintagePort();
    VintagePort(const char * br, int b, const char * nn, int y);
    VintagePort(const VintagePort & vp);
    ~VintagePort() {    delete [] nickname; }
    VintagePort & operator=(const VintagePort & vp);
    void Show() const;
    friend std::ostream & operator<<(std::ostream & os, const VintagePort & vp);
};
#endif
bottle.cpp
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
#include <iostream>
#include "bottle.h"
 
////////////////////////////////    Port        //////////////////////////
 
Port::Port(const char *br, const char *st, int b)
{
    brand = new char[std::strlen(br) + 1];
    std::strcpy(brand, br);
    std::strncpy(style, st, std::strlen(st) + 1);
    style[std::strlen(st) + 1] = '\0';
    bottles = b;
}
 
Port::Port(const Port &p)
{
    brand = new char[std::strlen(p.brand) + 1];
    std::strcpy(brand, p.brand);
    std::strncpy(style, p.style, std::strlen(p.style) + 1);
    style[std::strlen(p.style) + 1] = '\0';
    bottles = p.bottles;
}
 
Port & Port::operator =(const Port &p)
{
    if(this == &p)
        return *this;
    delete [] brand;
    brand = new char[std::strlen(p.brand) + 1];
    std::strcpy(brand, p.brand);
    std::strncpy(style, p.style, std::strlen(p.style) + 1);
    style[std::strlen(p.style) + 1] = '\0';
    bottles = p.bottles;
    return * this;
}
 
Port & Port::operator+=(int b)
{
    bottles += b;
    return *this;
}
 
Port & Port::operator -=(int b)
{
    if (b > BottleCount())
        std::cout << "Count of botteles on storage less than you want to take. The try is not successful.\n";
    else
        bottles -= b;
    return * this;
}
 
void Port::Show() const
{   std::cout << "Brand: " << brand << "\nKind: " << style << "\nBotteles: " << bottles << std::endl;   }
 
std::ostream & operator<<(std::ostream & os, const Port & p)
{   
    os << p.brand << ", " << p.style << ", " << p.bottles;
    return os;
}
 
////////////////////////////////    VintagePort     //////////////////////////
 
VintagePort::VintagePort() : Port()
{
    nickname = new char[1];
    nickname[0] = '\0';
    year = 0;
}
 
VintagePort::VintagePort(const char *br, int b, const char *nn, int y) : Port(br, "Vintage", b)
{
    nickname = new char[std::strlen(nn) + 1];
    std::strcpy(nickname, nn);
    year = y;
}
 
VintagePort::VintagePort(const VintagePort &vp) : Port(vp)
{
    nickname = new char[std::strlen(vp.nickname) + 1];
    std::strcpy(nickname, vp.nickname);
    year = vp.year;
}
 
VintagePort & VintagePort::operator =(const VintagePort &vp)
{
    if (this == &vp)
        return *this;
    delete [] nickname;
    nickname = new char[std::strlen(vp.nickname) + 1];
    std::strcpy(nickname, vp.nickname);
    year = vp.year;
    return *this;
}
 
void VintagePort::Show() const
{
    Port::Show();
    std::cout << "NickName: " << nickname << "\nYear: " << year << std::endl;
}
 
std::ostream & operator <<(std::ostream & os, const VintagePort & vp)
{
    os << (const Port &) vp;
    os << ", " << vp.nickname << ", " << vp.year << std::endl;
    return os;
}
useBottle.cpp
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
#include <iostream>
#include "bottle.h"
 
using namespace std;
 
char * setNickName(int tnn);
char * setStyle(int s);
 
int main()
{
    int numVine;
    cout << "Enter count of brands: ";
    cin >> numVine;
    Port ** p_vines = new Port*[numVine];   
    char tempBrand[20];
    int tempStyle;                              // 1 - VintagePort, 2 - Tawny, 3 - Ruby
    int tempBottles;
    int tempNickName;                       // 1 - The Noble, 2 - Old Velvet
    int tempYear;
 
    for (int i = 0; i < numVine; i++)
    {
        cout << "\nEnter Brand " << i + 1 << ": ";
        cin >> tempBrand;
        cout << "Set style of bottles: 1 - VintagePort, 2 - Tawny, 3 - Ruby: ";
        cin >> tempStyle;
        cout << "Enter count of botteles: ";
        while (cin >> tempBottles && tempBottles < 0)
            cout << "Count of bottles must be positive. Enter count of botteles AGAIN: ";
        if (tempStyle == 1)
        {
            cout << "Enter 1 for nickName "The Noble" and 2 for nickName "Old Velvet": ";
            cin >> tempNickName;
            cout << "Enter year: ";
            while (cin >> tempYear && ( tempYear < 1000 || tempYear > 2017))
                cout << "Enter year: ";
            p_vines[i] = new VintagePort(tempBrand, tempBottles, setNickName(tempNickName), tempYear);
        }
        else
        {
            p_vines[i] = new Port(tempBrand, setStyle(tempStyle), tempBottles);
        }
    }
 
    cout << endl;
 
    for (int i = 0; i < numVine; i++)
    {
        p_vines[i] ->Show();
        cout << endl;
    }
 
    int b;
    cout << "Enter count of bottles you want to take: ";
    cin >> b;
    for (int i = 0; i < numVine; i++)
        p_vines[i] = p_vines[i] + b;
 
    for (int i = 0; i < numVine; i++)
        delete p_vines[i];
 
    return 0;
}
 
char * setStyle(int s)
{
    if (s == 1)         return "VintagePort";
    else if (s == 2)    return "Tawny";
    else if (s == 3)    return "Ruby";
    else                return "none";
}
 
char * setNickName(int tnn)
{
    if (tnn == 1)       return "The Noble";
    else if (tnn == 2)  return "Old Velvet";
    else                return "none";
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.06.2017, 15:03
Ответы с готовыми решениями:

Перегрузка операций
Уважаемые программисты! Помогите новичку! Мне нужно написать программу, в которой реализуется...

Перегрузка операций
Добрый день! Задание простенькое но не могу решить так как не получается перегрузка операций....

Перегрузка операций
Здравствуйте, помогите с лабораторной. Я правильно сделал и как менять названия у перегрузки...

Перегрузка операций
#include &lt;iostream&gt; using namespace std; class chislo { public: chislo(); chislo(int...

8
Форумчанин
Эксперт CЭксперт С++
8191 / 5041 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.06.2017, 15:33 2
Цитата Сообщение от mariellla Посмотреть сообщение
Port & operator+(int b);
+=.
0
0 / 0 / 1
Регистрация: 05.09.2016
Сообщений: 55
05.06.2017, 16:10  [ТС] 3
Цитата Сообщение от MrGluck Посмотреть сообщение
Port & operator+(int b);
+=.
Да вроде бы не получается..
0
зомбяк
1564 / 1213 / 345
Регистрация: 14.05.2017
Сообщений: 3,935
05.06.2017, 16:26 4
Цитата Сообщение от mariellla Посмотреть сообщение
C++
1
Port & operator+(int b);* * // add b to bottles
здесь должно быть +=
0
0 / 0 / 1
Регистрация: 05.09.2016
Сообщений: 55
05.06.2017, 16:37  [ТС] 5
Так я уже изменила. Все равно вылетает ошибка..
0
Форумчанин
Эксперт CЭксперт С++
8191 / 5041 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.06.2017, 16:39 6
Цитата Сообщение от mariellla Посмотреть сообщение
Так я уже изменила. Все равно вылетает ошибка..
Ошибку выложите. Если ошибка при выполнении - посмотрите в отладчике что её вызвало.
0
0 / 0 / 1
Регистрация: 05.09.2016
Сообщений: 55
05.06.2017, 18:19  [ТС] 7
Вот такая проблема
Миниатюры
Перегрузка операций += и -=  
0
Форумчанин
Эксперт CЭксперт С++
8191 / 5041 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
05.06.2017, 18:40 8
mariellla,
Цитата Сообщение от MrGluck Посмотреть сообщение
Если ошибка при выполнении - посмотрите в отладчике что её вызвало.
В Visual Studio есть прекрасный отладчик, в который можно перейти сразу по ошибке
0
зомбяк
1564 / 1213 / 345
Регистрация: 14.05.2017
Сообщений: 3,935
05.06.2017, 18:44 9
Лучший ответ Сообщение было отмечено mariellla как решение

Решение

В строке 24 меняем
C++
1
cin >> tempBrand;
на
C++
1
(cin >> tempBrand).get();
чтоб оно считало нажатый после ввода строки Enter. Далее, собственно почему ошибка -

C++ (Qt)
1
2
    for (int i = 0; i < numVine; i++)
        p_vines[i] = p_vines[i] + b;
тут явный бред. Я б переписал так:

C++
1
    Port & operator-=(int &b);   // del b from bottles, if it's possible
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Port & Port::operator -=(int &b)
{
    if (b > bottles)
    {
        std::cout << "Count of botteles on storage less than you want to take. Only "<< bottles << " of " << brand << " have been taken." << std::endl;
        b -= bottles;
        bottles = 0;
    }
    else
        {
        bottles -= b;
        b = 0;
        }
    return * this;
}
и в вызове
C++
1
2
    for (int i = 0; i < numVine; i++)
        *p_vines[i] -= b;
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.06.2017, 18:44
Помогаю со студенческими работами здесь

Перегрузка операций
Задание у меня перегрузить операции: + добавить элемент в множество; * пересечение множеств;...

Перегрузка операций
Начал изучать перегрузку операций, и чего-то вроде не понял или что... Вообщем не могу понять чего...

Перегрузка операций
Здравствуйте. Объясните механизма операции инкремента. Как работают эти строки: Counter(int c) :...

Перегрузка операций '<<' и '>>'
Добрый вечер всем:) У меня вот такое задание: Создайте класс, реализующий однонаправленную...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru