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

Классы. Композиция

10.10.2021, 21:04. Показов 834. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Класс клавиатура и клавиши связаны композицией.
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
#include "stdafx.h"
#include <iostream>
#include "conio.h"
#include "string"
using namespace std;
class key{
private:
    string name;//Имя клавиши(символ)
    string group;//Группа клавиш
    int code;//Код клавиши
    int line;//Строка, в которой находится клавиша
public:
    key(){name="none"; group="none";code=0;line=0;}
    key(string p1, string p2, int p3, int p4){name=p1; group=p2; code=p3;line=p4;}
    key(key &s){name=s.name; group=s.group; code=s.code;line=s.line;}
    ~key(){}
 
    void setName(string p){name=p;}
    void setGroup(string p){group=p;}
    void setCode(int p){code=p;}
    void getLine(int p){line=p;}
    
    string getName(){return name;}
    string getGroup(){return group;}
    int getCode(){return code;}
    int getLine(){return line;}
 
    void print(){cout<<" Key name: "<<name<<" ,group: "<<group<<" ,code: "<<code<<" ,line: "<<line<<endl;}
 
    key getObj(){return *this;}//Указатель на объект класса
};
class keyboard{
private:
    string firma;//Фирма(производитель)
    string type;//Тип клавитуры
    string raskladka;//Раскладка
    int keys;//Количество клавиш(max)
    int t;//кол-во инициализированых клавиш
    key **MK;//Указатель на массив клавиш
    
    void add_mem()
    {
        key **tmp;
        tmp=new key*[keys];
        memcpy(tmp, MK, t*sizeof(key*));
        keys+=keys/2;
        delete []MK;
        MK=new key*[keys];
        memcpy(MK, tmp, t*sizeof(key*));
        delete []tmp;
    }
    
    void del_mem()
    {
        key **tmp;
        tmp=new key*[t];
        memcpy(tmp, MK, t*sizeof(key*));
        keys-=keys/3;
        delete []MK;
        MK=new key*[keys];
        memcpy(MK, tmp, t*sizeof(key*));
        delete []tmp;
    }
 
public:
    keyboard(){firma="none"; type="none"; raskladka="none"; keys=0; t=0; MK=new key*[keys];}
    keyboard(string p1, string p2, string p3, int p4){
        p1=firma;
        p2=type;
        p3=raskladka;
        if(p4<0) keys=abs(p4);
        t=0;
        MK=new key*[keys];
    }
    keyboard(keyboard &o){
        firma=o.firma;
        type=o.type;
        raskladka=o.raskladka;
        keys=o.keys;
        t=o.t;
        MK=new key*[keys];
        for(int i=0; i<t; i++)
        {
            MK[i]=new key(o.MK[i]->getObj());
        }
    }
    void print()
    {
        cout<<"\nFirma: "<<firma<<"Type: "<<type<<"Raskladka: "<<raskladka<<"Keys: "<<keys<<"Cur: "<<t<<endl;
        if(t>0) for(int i=0; i<t; i++) {cout<<i+t<<". ";MK[i]->print();}
    }
    void add(key &o)
    {
        if(t>=keys){add_mem();}
        MK[t]=new key(o);
        t++;
    }
    bool del(int nom)
    {
        bool vz=false;
        if(nom>t&&nom<=t)cout<<"This key dont exist!";
        else
        {
            delete MK[nom-1];
            if(nom<t){
                for(int i=nom-1; i<t-1; i++) MK[i]=MK[i+1];
                MK[t-1]=NULL;
            }
            t--;
            if(t<keys/2&&keys>14){del_mem();}
        }
    }
        ~keyboard(){
        if(t>0){
            for(int i; i<t; i++) delete MK[i];
        }
        delete []MK;
    }
};
int _tmain(int argc, _TCHAR* argv[])
{
    string p1, p2;
    int p3, p4, s=0;
    keyboard a("Samsung","Mechanic", "English", 100);
    key c("F1","functional" ,112, 1);
    a.add(c);
    do
    {
        cout<<"Menu: "<<endl;
        cout<<"[1]Keyboard and key"<<endl;
        cin>>s;
        switch(s)
        {
        case 1:{a.print();break;}
        }
    }
    while(s<8);
 
    getch();
    return 0;
}
Программа работает через раз, иногда может выдать ошибку или просто вывести некорректные значения.
Вывод:
Firma: Type: Raskladka: Keys: 13316376Cur: 1
1. Key name: F1 ,group: functional ,code: 112 ,line: 1

В чем ошибка?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2021, 21:04
Ответы с готовыми решениями:

C++ Агрегация и композиция
Необходимо создать программу, реализующую отношение агрегации или композиции. Для всех закрытых...

Проблема в понимании ООП(абстрактные классы, классы интерфейсы)
Всем здравия. Читал в свое время разные книги(к примеру, Гради Буч по проектированию) вроде все...

Композиция двух классов и вложенные классы
Привет, народ! Собственно говоря вот задача. Существуют 2 класса: 1. Создать класс LongLong для...

Создать классы: колесо, велосипед и автомобиль (иерархия или композиция)
Помогите решить задачу очень нужно: Создать классы: колесо, велосипед и автомобиль. ...

Композиция
Добр время суток. Объясните пожалуйста принцип действия композиции и как с ней работать и что это...

3
Just Do It!
3841 / 2286 / 636
Регистрация: 23.09.2014
Сообщений: 7,071
Записей в блоге: 3
16.10.2021, 18:30 2
Цитата Сообщение от SSaltMakerR Посмотреть сообщение
Программа работает через раз
если программа работает неправильно,
то как тогда можно узнать про то,
как должна работать программа?
0
1 / 1 / 0
Регистрация: 16.01.2021
Сообщений: 141
18.10.2021, 12:05  [ТС] 3
XLAT, Неправильный вывод.
Firma: Type: Raskladka: Keys: 13316376Cur: 1
1. Key name: F1 ,group: functional ,code: 112 ,line: 1

Должно быть
Firma: Samsung Type: Mechanic Raskladka: English Keys: 100 Cur: 1
1. Key name: F1 ,group: functional ,code: 112 ,line: 1
0
фрилансер
5499 / 5095 / 1047
Регистрация: 11.10.2019
Сообщений: 13,345
18.10.2021, 12:09 4
Цитата Сообщение от SSaltMakerR Посмотреть сообщение
int keys;
поле не инициализировано

Добавлено через 1 минуту
и вот сюда под if не заходит управление
Цитата Сообщение от SSaltMakerR Посмотреть сообщение
keyboard(string p1, string p2, string p3, int p4){
...
        if(p4<0) keys=abs(p4);
0
18.10.2021, 12:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.10.2021, 12:09
Помогаю со студенческими работами здесь

Композиция с++
Подскажите полузнайства! На примере как реализовать конструктор копии если у меня есть 2 класса с...

Наследование и композиция
Добрый день. Помогите, пожалуйста, разобраться в приведенном примере. #include &lt;iostream&gt;...

Агрегация и композиция
Нужно сделать композицию и агрегацию, на основание этого кода(композицию и агрегацию отдельно двумя...

Композиция/Агрегация
Не понимаю четкой разницы между этими понятиями. Нашел тему на форуме...

Композиция классов
Добрый день, Всем! Получил на лекции задание создать композицию классов и 3 классов. 1. Класс...


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

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