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

Конструктор и деструктор в С++

11.03.2019, 20:44. Просмотров 1695. Ответов 30
Метки нет (Все метки)

Никак не могу найти ошибку. Выдает несоответствие результата и функции
/gkh.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
107
108
109
110
111
112
#include <string>
#include <fstream>
#include "gkh.h"
 
Gkhs::~Gkhs() {
    Gkhs::save();
}
void Gkhs::save() {
    std::ofstream fout("gkhs.txt", std::ios::app);
    fout << Gkhs::get_name() << " "
        << Gkhs::get_last_name() << " ";
    for (int i = 0; i < 5; ++i) {
        fout << Gkhs::sc[i] << " ";
        fout << Gkhs::vsa_sum << " ";
    }
    fout << std::endl;
 
    fout.close();
}
Gkhs::Gkhs(std::string name, std::string last_name) {
    Gkhs::set_name(name);
    Gkhs::set_last_name(last_name);
}
void Gkhs::set_name(std::string gkh_name) {
    Gkhs::name = gkh_name;
}
std::string Gkhs::get_name() {
    return Gkhs::name;
}
void Gkhs::set_last_name(std::string gkh_last_name) {
    Gkhs::last_name = gkh_last_name;
}
std::string Gkhs::get_last_name() {
    return Gkhs::last_name;
}
void Gkhs::set_sc(float sc[]) {
    float sum = 0;
    for (int i = 0; i < 5; ++i) {
        Gkhs::sc[i] = sc[i];
         sum += sc[i];  
    }
}
float *Gkhs::get_sc() {
    return Gkhs::sc;
}
void Gkhs::set_vsa_sum(float sum) {
    Gkhs::vsa_sum = sum;
}
float *Gkhs::get_vsa_sum() {
    return Gkhs::vsa_sum;
}
 
/gkh.h/
#pragma once 
#include <string>
class Gkhs {
public:
    void save();
    ~Gkhs();
    Gkhs(std::string, std::string);
 
    void set_name(std::string);
    std::string get_name();
 
    void set_last_name(std::string);
    std::string get_last_name();
 
    void set_sc(float[]);
    float *get_sc();
    std::string get_sc_str(char);
 
    void set_vsa_sum(float);
    float *get_vsa_sum();
    std::string get_vsa_sum_str(char);
private:
    float sc[5];
    float vsa_sum;
    std::string name;
    std::string last_name;
};
 
/main.cpp/
#include <iostream>
#include "gkh.h"
int main(int argc, char *argv[]) {
    std::string name;
    std::string last_name;
    std::cout << "Name: ";
    getline(std::cin, name);
    std::cout << "Last name: ";
    getline(std::cin, last_name);
 
    Gkhs *gkh = new Gkhs(name, last_name);
    float sc[5];
    float sum = 0;
    std::string gkh_sc[] = { " gas : ", " h.voda : ", " teplo : ", " drova : ", " g.voda : " };
    int k = 0;
    for (int i = 0; i < 5; ++i) {
        std::cout << "usluga " << gkh_sc[k++];
        std::cin >> sc[i];
        sum = sum + sc[i];
    }
    gkh->set_sc(sc);
    float vsa_sum = sum;
    gkh->set_vsa_sum(vsa_sum);
    std::cout << " Sum for " << gkh->get_name() << " "
        << gkh->get_last_name() << " is "
        << gkh->get_vsa_sum() << std::endl;
    delete gkh;
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.03.2019, 20:44
Ответы с готовыми решениями:

Конструктор инициализации, конструктор копирования, деструктор
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор...

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать...

конструктор и деструктор
помоги пожалуйста написать программу в которой создаются и разрушаются объекты определенного...

Конструктор/деструктор
Подскажите пожалуйста как внедрить в вот эту программу конструктор и деструктор... В программе...

30
Модератор
Эксперт по электронике
8274 / 6133 / 822
Регистрация: 14.02.2011
Сообщений: 21,327
11.03.2019, 20:51 2
Цитата Сообщение от Евгений2996 Посмотреть сообщение
Gkhs::save();
вот так вызываются статические функции, а она не статическая
Цитата Сообщение от Евгений2996 Посмотреть сообщение
void Gkhs::save()
0
Заблокирован
11.03.2019, 21:02  [ТС] 3
И как тогда должна выглядеть программа? Я немного не понимаю, что вы хотите мне сказать
0
284 / 175 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 21:09 4
Цитата Сообщение от ValeryS Посмотреть сообщение
вот так вызываются статические функции, а она не статическая
Что запрещает так вызывать не статические функции?
0
Модератор
Эксперт по электронике
8274 / 6133 / 822
Регистрация: 14.02.2011
Сообщений: 21,327
11.03.2019, 21:24 5
Цитата Сообщение от rat0r Посмотреть сообщение
Что запрещает так вызывать не статические функции?
статическая функция всегда находится в памяти(имеет адрес) а не статическая только тогда когда создан экземпляр класса

Добавлено через 1 минуту
Цитата Сообщение от Евгений2996 Посмотреть сообщение
И как тогда должна выглядеть программа?
так
C++
1
2
3
Gkhs::~Gkhs() {
save();
}
или так
C++
1
2
3
Gkhs::~Gkhs() {
this->save();
}
0
Комп_Оратор)
Эксперт по математике/физике
8454 / 4213 / 573
Регистрация: 04.12.2011
Сообщений: 12,598
Записей в блоге: 14
11.03.2019, 21:24 6
Цитата Сообщение от ValeryS Посмотреть сообщение
статическая функция всегда находится в памяти(имеет адрес) а не статическая только тогда когда создан экземпляр класса
Он же внутри методов экземпляра использует прямое разрешение доступа. Я тоже сначала не понял.
0
284 / 175 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 21:26 7
Цитата Сообщение от ValeryS Посмотреть сообщение
или так
или так
C++
1
2
3
Gkhs::~Gkhs() {
Gkhs::save();
}
1
Модератор
Эксперт по электронике
8274 / 6133 / 822
Регистрация: 14.02.2011
Сообщений: 21,327
11.03.2019, 21:30 8
Цитата Сообщение от Евгений2996 Посмотреть сообщение
fout << Gkhs::sc[i] << " ";
rat0r, вот это тоже правильно?
0
Заблокирован
11.03.2019, 21:32  [ТС] 9
Цитата Сообщение от ValeryS Посмотреть сообщение
так
C++Выделить код
1
2
3
Gkhs::~Gkhs() {
save();
}
или так
C++Выделить код
1
2
3
Gkhs::~Gkhs() {
this->save();
}
Цитата Сообщение от ValeryS Посмотреть сообщение
так
C++Выделить код
1
2
3
Gkhs::~Gkhs() {
save();
}
или так
C++Выделить код
1
2
3
Gkhs::~Gkhs() {
this->save();
}
После изменения ничего не изменилось. всё так же выдает ошибку.
0
284 / 175 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 21:34 10
Цитата Сообщение от ValeryS Посмотреть сообщение
вот это тоже правильно?
А почему нет?
0
Модератор
Эксперт по электронике
8274 / 6133 / 822
Регистрация: 14.02.2011
Сообщений: 21,327
11.03.2019, 21:36 11
Цитата Сообщение от rat0r Посмотреть сообщение
А почему нет?
и к какому экземпляра класса идет обращение?
0
284 / 175 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 21:37 12
Цитата Сообщение от ValeryS Посмотреть сообщение
и к какому экземпляра класса идет обращение?
*this
1
3508 / 1967 / 825
Регистрация: 07.02.2019
Сообщений: 5,277
11.03.2019, 22:43 13
Цитата Сообщение от rat0r Посмотреть сообщение
А почему нет?
нельзя обращаться к нестатическому методу не из объекта
0
284 / 175 / 21
Регистрация: 16.02.2018
Сообщений: 666
11.03.2019, 22:45 14
Цитата Сообщение от zayats80888 Посмотреть сообщение
нельзя обращаться к нестатическому методу не из объекта
Да тут вроде везде "из объекта".
0
3508 / 1967 / 825
Регистрация: 07.02.2019
Сообщений: 5,277
11.03.2019, 22:50 15
Цитата Сообщение от rat0r Посмотреть сообщение
Да тут вроде везде "из объекта".
а, это у него реализация, просто разрешение доступа тут избыточно, потому я подумал что это внешняя функция
0
Заблокирован
11.03.2019, 23:17  [ТС] 16
Цитата Сообщение от rat0r Посмотреть сообщение
или так
C++
1
2
3
Gkhs::~Gkhs() {
Gkhs::save();
}
При изменении программы, как было сказано, выдается ошибка. Преобразование float выполняется неверно
Цитата Сообщение от ValeryS Посмотреть сообщение
так
C++Выделить код
1
2
3
Gkhs::~Gkhs() {
save();
}
или так
C++Выделить код
1
2
3
Gkhs::~Gkhs() {
this->save();
}
0
3508 / 1967 / 825
Регистрация: 07.02.2019
Сообщений: 5,277
11.03.2019, 23:25 17
Лучший ответ Сообщение было отмечено Евгений2996 как решение

Решение

Вот запихнул в один файл, у вас там float во float* преобразовывалось
Кликните здесь для просмотра всего текста
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
#include <string>
#include <fstream>
#include <iostream>
 
class Gkhs {
public:
    void save();
    ~Gkhs();
    Gkhs(std::string, std::string);
 
    void set_name(std::string);
    std::string get_name();
 
    void set_last_name(std::string);
    std::string get_last_name();
 
    void set_sc(float[]);
    float *get_sc();
    std::string get_sc_str(char);
 
    void set_vsa_sum(float);
    float get_vsa_sum();
    std::string get_vsa_sum_str(char);
private:
    float sc[5];
    float vsa_sum;
    std::string name;
    std::string last_name;
};
 
Gkhs::~Gkhs() {
    Gkhs::save();
}
void Gkhs::save() {
    std::ofstream fout("gkhs.txt", std::ios::app);
    fout << Gkhs::get_name() << " "
        << Gkhs::get_last_name() << " ";
    for (int i = 0; i < 5; ++i) {
        fout << Gkhs::sc[i] << " ";
        fout << Gkhs::vsa_sum << " ";
    }
    fout << std::endl;
 
    fout.close();
}
Gkhs::Gkhs(std::string name, std::string last_name) {
    Gkhs::set_name(name);
    Gkhs::set_last_name(last_name);
}
void Gkhs::set_name(std::string gkh_name) {
    Gkhs::name = gkh_name;
}
std::string Gkhs::get_name() {
    return Gkhs::name;
}
void Gkhs::set_last_name(std::string gkh_last_name) {
    Gkhs::last_name = gkh_last_name;
}
std::string Gkhs::get_last_name() {
    return Gkhs::last_name;
}
void Gkhs::set_sc(float sc[]) {
    float sum = 0;
    for (int i = 0; i < 5; ++i) {
        Gkhs::sc[i] = sc[i];
         sum += sc[i];  
    }
}
float *Gkhs::get_sc() {
    return Gkhs::sc;
}
void Gkhs::set_vsa_sum(float sum) {
    Gkhs::vsa_sum = sum;
}
float Gkhs::get_vsa_sum() {
    return Gkhs::vsa_sum;
}
 
 
 
 
 
int main(int argc, char *argv[]) {
    std::string name;
    std::string last_name;
    std::cout << "Name: ";
    getline(std::cin, name);
    std::cout << "Last name: ";
    getline(std::cin, last_name);
 
    Gkhs *gkh = new Gkhs(name, last_name);
    float sc[5];
    float sum = 0;
    std::string gkh_sc[] = { " gas : ", " h.voda : ", " teplo : ", " drova : ", " g.voda : " };
    int k = 0;
    for (int i = 0; i < 5; ++i) {
        std::cout << "usluga " << gkh_sc[k++];
        std::cin >> sc[i];
        sum = sum + sc[i];
    }
    gkh->set_sc(sc);
    float vsa_sum = sum;
    gkh->set_vsa_sum(vsa_sum);
    std::cout << " Sum for " << gkh->get_name() << " "
        << gkh->get_last_name() << " is "
        << gkh->get_vsa_sum() << std::endl;
    delete gkh;
    system("pause");
    return 0;
}
1
Модератор
Эксперт по электронике
8274 / 6133 / 822
Регистрация: 14.02.2011
Сообщений: 21,327
12.03.2019, 14:48 18
rat0r, был неправ
но такой синтаксис отродясь не видел
0
284 / 175 / 21
Регистрация: 16.02.2018
Сообщений: 666
12.03.2019, 16:02 19
Цитата Сообщение от ValeryS Посмотреть сообщение
но такой синтаксис отродясь не видел
Сирьёзно? Никогда не видел вызов метода базового класса, скрытого в отнаследовавшемся? Например, в операторе присваивания
C++
1
D& D::operator(const D& that) { Base::operator=(that); ... }
0
2533 / 1193 / 357
Регистрация: 30.11.2013
Сообщений: 3,817
12.03.2019, 16:14 20
Цитата Сообщение от rat0r Посмотреть сообщение
Никогда не видел вызов метода базового класса, скрытого в отнаследовавшемся?
Я такого не видел - покажите пример пожалуйста
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.03.2019, 16:14

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

конструктор и деструктор в C++
Помогите добавить в прогу конструктор и деструктор #include &lt;iostream&gt; using namespace std; ...

Конструктор, деструктор
Дорогие друзья, программисты. Помогите пожалуйста разобраться с конструктором и деструктором, а так...

Конструктор и деструктор
Помогите к этой программе написать Конструктор и деструктор класса #include &lt;iostream&gt; using...

конструктор и деструктор
Почему деструктор не вызывается? #include &lt;iostream.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; ...


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

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

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