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

Реализовать класс "курсор", используя конструкторы, перегрузку операций и обработку исключений

15.08.2018, 23:11. Показов 680. Ответов 3
Метки нет (Все метки)

Написал код, тут реализован класс "курсор" где указаны манипуляции с разными его параметрами.
Сказали теперь выполнить это с конструкторами, перегрузкой операций и обработкой исключений. (и попросили сделать с разделением в CB, в прочем, как и сделал)
Вопрос собственно в том, что:
1) Выполнить с конструкторами, можно просто запилить в public: для примера конструктор в котором очистим строку класса от мусора? Или надо создать конструктор на класс курсора и туда засунуть переменные со значениями?
2) Выполнить с перегрузкой операций: операций? это как? может операторов? немного не понял, как тут это реализовать.
3) Выполнить с обработкой исключений: это, просто взять, и задать в простом исключении, что например какая то переменная,
например горизонталь, не должна быть <0 и вывести сообщение об ошибке?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
try //код, который может привести к ошибке (<0)
        {  
            if (условие)
            {
                throw 123; //№ошибки
            }
            cout << ... << endl;   
        }
        catch(int i)//<< 123
        {
            cout
Так получается надо выполнить?

main.cpp
C++ (Qt)
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
using namespace std;
 
int main()
{
   Cursor q,copq;
    q.Read();
    copq=Cursor(q);
   int x,y;
cout << "Enter new number of a horizontal" << endl;
 cin >> x;
cout << "Enter new number of a vertical" << endl;
 cin >> y;
   q.Ismen_Coordinat(x,y);
   copq=Cursor(q);
string z;
cout << "Enter new appearance" << endl;
 cin >> z;
   q.Ismen_Vida(z);
   copq=Cursor(q);
cout << "Enter new size" << endl;
 cin >> x;
   q.Ismen_Rasmera(x);
   copq=Cursor(q);
   q.Obnul();
   q.Vostanovit(copq);
   q.Otchet();
    return 0;
}
q.h
C++ (Qt)
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
using namespace std;
 
class Cursor{
    private:
    int gor;
    int ver;
    string vid;
    int ras;
 
 
    public:
    Cursor();
    Cursor(const Cursor&);
    Cursor(int,int,string,int);
    void Read();
    void Ismen_Coordinat(int,int);
    void Ismen_Vida(string);
    void Ismen_Rasmera(int);
    void Obnul();
    void Vostanovit(const Cursor&);
    void Otchet();
    friend ostream& operator<<(ostream&,const Cursor&);
    friend istream& operator>>(istream&, Cursor&);
    friend Cursor operator+ (const Cursor& ,const Cursor&);
    friend Cursor operator- (const Cursor& ,const Cursor&);
    string toString();
};
q.cpp
C++ (Qt)
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
Cursor::Cursor():
gor(100),ver(100),vid("horizontal"),ras(5){};
 
 
Cursor::Cursor(int _gor,int _ver,string _vid,int _ras):
gor(_gor),ver(_ver),vid(_vid),ras(_ras){};
 
Cursor::Cursor(const Cursor& _q):
gor(_q.gor),ver(_q.ver),vid(_q.vid),ras(_q.ras){};
 
void Cursor::Ismen_Coordinat(const int _gor,const int _ver){
gor=_gor;
ver=_ver;
};
 
void Cursor::Read(){
cout << "Ent horizontal" << endl;
cin >> gor;
cout << "Ent vertical" << endl;
cin >> ver;
cout << "Ent exterior" << endl;
cin >> vid;
cout << "Ent size" << endl;
int _ras;
cin >> _ras;
if((ras<=15)&&(ras>=1)){
    ras=_ras;}else {
        cout << "Error. BZ=5" << endl;
        ras=5;
     }
}
 
void Cursor::Ismen_Vida(const string _vid){
vid=_vid;
};
 
void Cursor::Ismen_Rasmera(const int _ras){
if((_ras<=15)&&(_ras>=1)){
    ras=_ras;}else {
                cout << "Error" << endl;
     }
};
 
void Cursor::Obnul(){
gor=100;
ver=100;
vid="horizontal";
ras=5;
};
 
 
void Cursor::Vostanovit(const Cursor& _q){
gor=_q.gor;
ver=_q.ver;
vid=_q.vid;
ras=_q.ras;
};
 
 void Cursor::Otchet(){
cout << "horizontal="<< gor<<endl;
cout << "vertical="<<ver<<endl;
cout << "exterior - "<<vid<<endl;
cout << "size="<<ras<<endl;
 };
 
 ostream& operator<<(ostream &cout, const Cursor& q){
cout << "horizontal="<<q.gor<<endl;
cout << "vertical="<<q.ver<<endl;
cout << "exterior="<<q.vid<<endl;
cout << "size="<<q.ras<<endl;
return cout;
 };
 
 istream& operator>>(istream& cin, Cursor& q){
cin >>q.gor;
cin >>q.ver;
cin >>q.vid;
cin >>q.ras;
return cin;
 };
 
 string Cursor::toString(){
char str[80];
sprintf(str,"%d %d %s %d",gor,ver,vid.c_str(),ras);
return str;
};
 
    Cursor operator+ (const Cursor& a1,const Cursor& a2){
        if (a1.ras+a2.ras>15) {cout<<"Error"; return a1;}
        Cursor a((a1.gor+a2.gor),(a1.ver+a2.ver),"Gor",(a1.ras+a2.ras));
        return a;
    }
    Cursor operator- (const Cursor& a1,const Cursor& a2){
        if (a1.ras-a2.ras<1) {cout<<"Error"; return a1;}
         Cursor a((a1.gor-a2.gor),(a1.ver-a2.ver),"Gor",(a1.ras-a2.ras));
        return a;
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2018, 23:11
Ответы с готовыми решениями:

Реализовать класс для выполнения арифметических действий с дробями, включая конструкторы и перегрузку операций
Доброго времени суток!! Нужна помощь с заданием, необходимо скоро сдавать лабораторку:( Задание:...

Описать класс "Многочлен" и перегрузку операций для этого класса — сложения, умножения, вычитания
Доброго времени суток)) Как можно описать класс &quot;Многочлен&quot; ну и перегрузку операций для этого...

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число"
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию...

Описать класс "многочлен", реализовать методы "произведение многочленов", "сравнение на равенство"
описать класс &quot;многочлен&quot;.реализовать методы &quot;произведение многочленов&quot;, &quot;сравнение на равенство&quot;,...

3
3 / 3 / 0
Регистрация: 07.01.2017
Сообщений: 101
17.08.2018, 22:41  [ТС] 2
=( по ходу ни кто не подскажет.
0
36 / 37 / 10
Регистрация: 02.04.2016
Сообщений: 300
18.08.2018, 05:15 3
Вопросы заказчика - к заказчику. Гадать и спрашивать форумы - пустой звук для заказчика. Я уже на это наступил не раз.
1) Суть конструктора в создании объекта, пригодного для работы.
Что ты там замутишь - инициализацию или главный цикл рендера графики - твоё дело.

2) Без комментариев. Телепатов здесь нет.

3) Исключение я для себя позиционирую как что-то ну прям вообще редкое.
Насколько редкое, что не должно мешать обычной отладке.
Например, есть у меня вот такая группа функций в игрушке,
в комментарии к последней и первой я описал проблему:
Кликните здесь для просмотра всего текста
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
CellsPool::RequestedCell CellsPool::getCell(Coord coord, FillerCreator filler_creator) {
    // Возьмём клетку по заданному направлению относительно текущей.
    CellPtr requested_cell = extractCell(coord);
    
    FillerUPtr new_filler = filler_creator(default_rectangle, requested_cell->coord);
    
    try {
        AvailablesIter available_cell = findInAvailable(requested_cell);
        return kickFromAvailable(available_cell, std::move(new_filler));
    } catch(NotFoundFreeCell const& e) {
        // TODO: Переписать без исплючений.
        // * Здесь запрошенная клетка однозначно занята.
        // * Вернём заполнитель клетки, если она доступна для посещения.
        // * Иначе заполнитель остаётся,
        //   а змейка уже будет применять бонус этой клетки на себе,
        //   не занимая её.
        return requested_cell->filler->isCanBeTake()
               ? replaceFiller(requested_cell, std::move(new_filler))
               : RequestedCell { requested_cell, nullptr };
    }
}
 
void CellsPool::replaceFiller(CellCPtr target, FillerCreator filler_creator) {
    FillerUPtr&& new_filler = filler_creator(default_rectangle, target->coord);
    FillerUPtr& old_filler = const_cast<CellPtr>(target)->filler;
    
    std::swap(new_filler, old_filler);
}
 
 
CellsPool::RequestedCell CellsPool::replaceFiller(CellPtr target, FillerUPtr new_filler) {
    // Заменяем заполнитель переданным
    std::unique_ptr<Filler> prev_filler(std::move(target->filler));
    target->filler = std::move(new_filler);
    
    // и возвращаем клетку со старым заполнителем.
    return { target, std::move(prev_filler) };
}
 
 
CellsPool::RequestedCell CellsPool::kickFromAvailable(AvailablesIter target, FillerUPtr new_filler) {
    CellPtr ordered_cell = const_cast<CellPtr>(*target);
    // Удалим запрошенную клетку из доступных к использованию.
    available_cells.erase(target); // Now 'target' is not valid.
    
    // Сохраним прошлый заполнитель и поместим новый.
    return replaceFiller(ordered_cell, std::move(new_filler));
}
 
 
Coord CellsPool::normalize(Coord coord) const {
    // Обеспечивает перепрыгивание через границу поля на противоположную часть.
    auto normalize_component = [] (int c, int max) {
        return c >= 0 ? c % max : max + c;
    };
    return Coord(
        normalize_component(coord.x, count_cells_x),
        normalize_component(coord.y, count_cells_y)
    );
}
 
 
CellsPool::CellPtr CellsPool::extractCell(Coord coord) {
    coord = normalize(coord);
    return &cells[coord.y][coord.x];
}
 
 
CellsPool::AvailablesIter CellsPool::findInAvailable(CellCPtr cell) {
    // При попытке получить клетку по направлению или соседнюю к заданной
    // она может быть недоступна. Если так, то данная функция
    // выбросит исключение NotFoundFreeCell.
    
    // В поисках нужного пройдёмся по списку доступного...
    auto cur_cell = available_cells.begin();
    while(cur_cell != available_cells.end() && *cur_cell != cell)
        ++cur_cell;
    
    if(cur_cell != available_cells.end())
        return cur_cell;
    else // TODO: Переделать. Взятие еды - это не исключительная ситуация.
         // А ещё это мешает отладке.
         // Возвращаем итератор конца, если клетки нет.
         // Получив итератор конца, в RequestedCell поместим нулевой указатель.
         // А со змейкой и движением уже потом разберёмся...
        throw NotFoundFreeCell(cell);
}

Повторюсь, что взятие еды как клетки,
которая недоступна для размещения чего-либо (отсутствует в списке свободных),
но доступна для посещения - ещё не повод кричать SOS.
Взятие еды происходит слишком часто.
Взятие любого другого бонуса не будет отличаться от этого.

При постижении исключений как инструмента я долго не мог понять: зачем и когда.
Мне не хватало примера. Надеюсь, моего хватит.
Из-за вот такого решения мне теперь нужно переписать примерно 25% кода.
1
308 / 220 / 74
Регистрация: 23.05.2011
Сообщений: 980
18.08.2018, 07:51 4
С учётом того, что это учебная задачка, просто сделай так, чтобы было.
Над тем, насколько разумно применение исключения, перегрузки операторов сложения или исключениями, не задумывайся. Хотели бы чтобы это было к месту, дали бы задание получше.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2018, 07:51

Класс "Строка", реализовать через агрегирование, с использованием классов "Слово" и "Символ"
Создать объект класса &quot;Строка&quot;, используя классы &quot;Слово&quot;, &quot;Символ&quot;.Реализовать через агрегирование....

Реализовать класс "Книжный магазин", используя двусвязный список (ошибка с покупкой книги)
Доброго времени суток,мне нужно реализовать класс BookShop используя двусязный список,все методы...

Реализовать перегрузку операторов сравнения для пользовательского типа "Обыкновенная дробь"
Структура. дробное сравнение 1. Создайте структуру дробей, состоящую из двух полей int-type ...

как реализовать перегрузку опрератора "="?
есть класс Base: class Base { private: ... //переменные public: ...

Создать класс "Дата" с конструкторами, деструктором, указанными методами. Выполнить перегрузку указанных операторов
Создать класс Дата, с конструкторами, деструктором, установить дату, увеличить на 1 день (++),...

Реализовать связь классов "телефонная книга" и родительский класс "телефонный номер"
Суть проблемы:есть дочерний класс &quot;телефонная книга&quot; и родительский класс &quot;телефонный номер&quot;. В...


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

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

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