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

Классы и конструкторы

09.04.2018, 14:32. Показов 1547. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вообщем, вот мой код. Но мне сказали убрать все "cout" и вместо этого сделать так, что бы функции возвращали значения (я не шарю в этом), и так же нужно добавить конструктор. Буду очень благодарен за помощь

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
#include "stdafx.h"
#include "iostream"
using namespace std;
 
class Drob {
private: int ch, zn, k;
public:
    Drob() {
        ch = 0;
        zn = 0;}
    void RR(int a, int b) {
        ch = a;
        zn = b;
    }
    Drob Summa(Drob d2) {
        Drob d;
        d.zn = zn * d2.zn;
        d.ch = zn*d2.ch + d2.zn*ch;
        cout << "Сумма двух дробей = " << d.ch << "/" << d.zn << endl;
        return d;
    }
    Drob Vichitanie(Drob d2) {
        Drob d;
        d.zn = zn*d2.zn;
        d.ch = zn*d2.ch - d2.zn*ch;
        cout << "Разности двух дробей = " << d.ch << "/" << d.zn << endl;
        return d;
    }
    Drob Proizvedenie(Drob d2) {
        Drob d;
        d.zn = zn*d2.zn;
        d.ch = ch*d2.ch;
        cout << "Произведение двух дробей = " << d.ch << "/" << d.zn << endl;
        return d;
    }
    Drob Delenie(Drob d2) {
        Drob d;
        d.zn = zn*d2.ch;
        d.ch = ch*d2.zn;
        cout << "Частное двух дробей = " << d.ch << "/" << d.zn << endl;
        return d;
    }
    void Print() {
        cout << "Введите чилсо, которое прибавить и умножить на дробь=";
        cin >> k;
    }
    Drob Umnosh(Drob d2) {
        d2.zn = zn;
        d2.ch = ch*k;
        cout << "Умножение дроби на число " << k << " = " << d2.ch << "/" << d2.zn << endl;
        return d2;
    }
    Drob Pribavlenie(Drob d2) {
        d2.zn = zn;
        d2.ch = zn*k + ch;
        cout << "Прибавление к дроби числа " << k << " = " << d2.ch << "/" << d2.zn << endl;
        return d2;
    }
    bool Drob::Sravnenie(Drob d2) {
        if ((double(ch) / zn) == (double(d2.ch) / d2.zn))
            return true;
        else
            return false;
    }
};
 
int main() {
    setlocale(LC_ALL, "Russian");
    Drob d1, d2;
    d1.RR(10, 5);
    d2.RR(9, 3);
    d1.Summa(d2);
    d1.Vichitanie(d2);
    d1.Proizvedenie(d2);
    d1.Delenie(d2);
    d1.Print();
    d1.Umnosh(d2);
    d1.Pribavlenie(d2);
    cout << d1.Sravnenie(d2)<<"\n"<<"____________________________________"<<endl;
    return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2018, 14:32
Ответы с готовыми решениями:

Конструкторы и классы
Возникает ошибка что нет конструктора, хотя он есть. error C2514: 'B' : class has no constructors class B; class A { B* b;...

Классы, конструкторы
В понедельник последний день сдачи лабы. На выбор сделать одну из них: №1 Делать через классы и конструкторы. С использованием...

Классы и конструкторы в c++
Добрый день! Вот мой код и задание, не получается реализовать конструкторы копирования под б,в. А так же компилятор выдает вот такой ряд...

17
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
09.04.2018, 18:02
Какой конструктор то нужно добавить?
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
#include <iostream>
 
using namespace std;
 
class Drob 
{
private:
    int _ch;
    int _zn;
public:
    Drob() {
        _ch = 0;
        _zn = 0;
    }
    Drob(int a, int b)
    {
        _ch = a;
        _zn = b;
    }
    Drob(const Drob& obj)
    {
        this->_ch = obj._ch;
        this->_zn = obj._zn;
    }
    void SetValues(int a, int b) 
    {
        _ch = a;
        _zn = b;
    }
 
    Drob& Sum(const Drob obj)
    {
        this->_ch = this->_zn * obj._ch + obj._zn * this->_ch;
        this->_zn *= obj._zn;
        return *this;
    }
 
    Drob& Dif(const Drob obj)
    {
        this->_ch = obj._zn * this->_ch - this->_zn * obj._ch;
        this->_zn *= obj._zn;
        return *this;
    }
    
    Drob& Com(const Drob obj)
    {
        this->_ch *= obj._ch;
        this->_zn *= obj._zn;
        return *this;
    }
 
    Drob& Div(const Drob obj)
    {
        this->_ch *= obj._zn;
        this->_zn *= obj._ch;
        return *this;
    }
 
    Drob& Mul(int k)
    {
        this->_ch *= k;
        return *this;
    }
 
    Drob& Add(int k)
    {
        Drob temp(k, 1);
        this->Sum(temp);
        return *this;
    }
 
    friend ostream& operator<<(ostream& stream, const Drob& obj)
    {
        stream << obj._ch << "/" << obj._zn;
        return stream;
    }
 
    bool operator ==(const Drob& obj) const
    {
        return ((this->_ch == obj._ch) && (this->_zn == obj._zn));
    }
};
 
 
int main()
{
    setlocale(LC_ALL, "Russian");
    Drob d1, d2(2,4);
    Drob d3(d2);
    d1.SetValues(6, 8);
    cout << "Сумма двух дробей = " << d1.Sum(d2) << endl;
    cout << "Разности двух дробей = " << d1.Dif(d2) << endl;
    cout << "Произведение двух дробей = " << d1.Com(d2) << endl;
    cout << "Частное двух дробей = " << d1.Div(d2) << endl;
    int k = 5;
    cout << "Умножение дроби на число " << k << " = " << d1.Mul(k) << endl;
    cout << "Прибавление к дроби числа " << k << " = " << d1.Add(k) << endl;
    cout << "Сравнение дробей (d1,d2): " << boolalpha << (d1 == d2) << endl;
    cout << "Сравнение дробей (d2,d3): "  << boolalpha << (d2 == d3) << endl;
    return 0;
}
0
1 / 1 / 0
Регистрация: 13.11.2017
Сообщений: 80
09.04.2018, 18:57  [ТС]
Вообще конструктор можно любой. Спасибо большое за помощь. Как я понял вот в этой части кода 3 конструктора, можешь пожалуйста объяснить что делает последний?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 Drob() {
        _ch = 0;
        _zn = 0;
    }
    Drob(int a, int b)
    {
        _ch = a;
        _zn = b;
    }
    Drob(const Drob& obj)
    {
        this->_ch = obj._ch;
        this->_zn = obj._zn;
    }
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
09.04.2018, 19:06
Цитата Сообщение от BQ 201 Посмотреть сообщение
объяснить что делает последний
конструктор копирования, вызывается при копировании объекта.
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
09.04.2018, 20:15
Цитата Сообщение от BQ 201 Посмотреть сообщение
можешь пожалуйста объяснить что делает последний?
Последний, для твоего класса, не нужен. То же самое делает и неявный конструктор копирования.
0
1 / 1 / 0
Регистрация: 13.11.2017
Сообщений: 80
09.04.2018, 20:20  [ТС]
А это нормально что получаются такие большие значения в разности, произведении, частном, прибавлении и умножении на число таких дробей как 2/4 и 6/8 ?
Миниатюры
Классы и конструкторы  
0
1 / 1 / 0
Регистрация: 13.11.2017
Сообщений: 80
09.04.2018, 20:28  [ТС]
Как я понял, для выполнения какой либо операции, значения берутся из предыдущей операции. К примеру в произведении двух дробей берутся не 2/4 и 6/8, а 2/4 и 96/128.
Можно ли это исправить, что бы для всех операция брались дроби только 2/4 и 6/8 ?
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
09.04.2018, 20:59
BQ 201, Тогда смысл возвращать что-то в функциях как ты написал? Убираешь возврат и внутри функции делаешь в объявленом временном экземпляре операции и выводишь внутри функции, но это тот же cout, от которого ты просишь избавиться.

Если нужно постоянно с теми же значениями, то перед каждой функцией задавай конкретные (в примере, что я привел, через SetValues)
0
1 / 1 / 0
Регистрация: 13.11.2017
Сообщений: 80
09.04.2018, 21:17  [ТС]
Готово, теперь результаты те которые нужны, но у меня еще один вопрос. В операции сравнения дробей, в первой части сравниваются дроби 6/8 и 2/4, но во второй части (d2,d3) какие дроби сравниваются здесь?
Миниатюры
Классы и конструкторы  
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
09.04.2018, 21:20
Цитата Сообщение от SuperKir Посмотреть сообщение
Drob d1, d2(2,4); Drob d3(d2);
2/4 с 2/4
Для d2 срабатывает конструктор с параметрами, который задает значения 2,4.
В d3 копируются значения из d2.

Просто привел для примера вывод результата, когда дроби равны. Единственное, т.к. нет сокращений дробей, то сравнение проходит конкретно по параметрам числитель и знаменатель, переделай как тебе надо, как с тем же делением что было
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
09.04.2018, 21:24
SuperKir,
вместо
C++
1
2
3
4
5
Drob(const Drob& obj)
    {
        this->_ch = obj._ch;
        this->_zn = obj._zn;
    }
лучше писать
C++
1
Drob(const Drob& obj) = default;
Это даст результат не хуже, а скорее всего даже лучше (например, в моей версии сразу же получится ещё спецификатор noexcept).
0
1 / 1 / 0
Регистрация: 13.11.2017
Сообщений: 80
09.04.2018, 21:26  [ТС]
То есть во второй часть сравнивается дробь 2/4 сама с собой?
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
09.04.2018, 21:28
BQ 201, нет, сравниваются дроби с одинаковыми значениями.
New man, смотря кому лучше)
0
1 / 1 / 0
Регистрация: 13.11.2017
Сообщений: 80
09.04.2018, 21:30  [ТС]
Ну тогда на этом все, всем спасибо большое за помощь
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
09.04.2018, 21:44
SuperKir, всем лучше

В итоге выходит, что мы конструктор объявили, но по факту он такой же, какой и был.

И ещё неплохо сделать Drob()=default;
В итоге ничего не теряешь, а компилятор спокойно объявляет тип std::is_trivial<Drob>::value==true и во всяких реаллокациях стандартных векторов заменяет копирование на memmove.

Ну, и вот код, который подтверждает, что Drob() = default; делает то же, что и предыдущий.
Кликните здесь для просмотра всего текста
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
#include <type_traits>
 
class Drob 
{
public:
    int _ch;
    int _zn;
    Drob()=default;
    Drob(int a, int b)
    {
        _ch = a;
        _zn = b;
    }
    Drob(const Drob&) = default;
};
 
int main()
{
    Drob d;
    d._ch = 5;
    d._zn = 7;
    new(&d)Drob();
    std::cout<<d._ch<<" " << d._zn<<std::endl;
  std::cout<<std::is_trivial<Drob>::value;
}


Добавлено через 7 минут
И да, я предпочитаю, чтобы за меня код писали IDE, компилятор, мальчишка-индус, парни со стэковерфлоу, кто угодно, а не я
=default; очень приятен в этом плане.
0
1 / 1 / 0
Регистрация: 13.11.2017
Сообщений: 80
09.04.2018, 21:51  [ТС]
Хорошо учту это в будущем
0
Велосипедист...
 Аватар для Mournful Max
353 / 220 / 73
Регистрация: 15.12.2015
Сообщений: 785
09.04.2018, 21:56
Цитата Сообщение от New man Посмотреть сообщение
лучше писать
В данном случае, лучше вообще явно не объявлять конструктор копирования, разве нет?
Там же обычное почленное копирование идет, которое компилятор сам сделает, если нужно.
0
309 / 221 / 74
Регистрация: 23.05.2011
Сообщений: 981
09.04.2018, 22:12
Captain Maxee, ну, =default; именно это и делает.
А ещё делает то же самое для присваивания, move присваивания и т.п.

Добавлено через 13 минут
Сходу не могу придумать, для чего это можно использовать.

Разве что контроль над ресурсом. Пусть Resource — тяжёлый ресурс, выделение которого мы хотим проконтролировать.
То есть, при копировании, нам надо что-то дополнительно обработать. Пусть будет так, что он создаётся фабрикой, которую можно вызывать только в один поток. А вот move конструктор у него не требует никаких действий.
Из-за этого нам для класса, который содержить поле Resource, надо явно прописать copy-конструктор, но в то же время при объявлении хотя бы одного такого дефолтный move конструктор не появляется.

И это можно решить так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class ResourceContainer
{
    Resource res;
public:
    ResourceContainer(const ResourceContainer&);
    ResourceContainer(ResourceContainer&&) = default; // Заставляем компилятор его сгенерить
    // Он этого сам не делает, так как конструктор копирования объявлен
};
 
ResouceContainer::ResouceContainer(const ResourceContainer& obj):res(Resource::NO_ACTION)
{
    static std::mutex mutex;
    std::lock_guard<std::mutex> lock;
    std::cout<<"We start to make complex thing\n";
    res = resource_fabric.provide_copy<Resource::COMPLEX_ACTION>(obj);
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.04.2018, 22:12
Помогаю со студенческими работами здесь

Классы и конструкторы
#include &lt;string.h&gt; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; class automobile//создаём класс automobile ...

Конструкторы и классы
Определить класс список элементов. В определение класса включить два конструктора: для определения списка по его размеру и путем...

Классы. Конструкторы. Деструкторы
В Массиве рядок, который имеет минимальный елемент, отсортванть методом вставок с помощью классов. Текст программы я зделал трьома...

Классы, конструкторы (найти ошибку)
Народ помогите пожалуйста пишу на с++ уже приличное количество времени но никогда не любил классы)). И вот какая проблема вот код #include...

Классы, Конструкторы, Деструкторы. Отредактировать программу
#include &lt;iostream&gt; #include &lt;string&gt; #ifndef STUDENTH #define STUDENTH #endif using namespace std; const int...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru