Форум программистов, компьютерный форум CyberForum.ru

Неисправный код - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ одномерный массив http://www.cyberforum.ru/cpp-beginners/thread1305030.html
Помогите решить задачу:
C++ Можно ли обойтись без mutex? в оф мануале : The following example includes a bank account of a person (Joe) and two components, one corresponding to a bank agent depositing money in Joe's account, and one representing Joe. Joe will only be withdrawing money from the account: class BankAccount; BankAccount JoesAccount; void bankAgent() { for (int i =10; i>0; --i) { //... http://www.cyberforum.ru/cpp-beginners/thread1305024.html
Перестановка столбцов матрицы C++
Нужно отсортировать столбцы матрицы по убыванию сумм их элементов. Помогите с сортировкой, пожлуйста
C++ Подскажите пожалуйста что нужно исправлять
#include <iostream> #include <math.h> using namespace std; int main() { double y, x, Pi; Pi = 3.14159; x = -Pi; while (x <= Pi)
C++ Связь между программами http://www.cyberforum.ru/cpp-beginners/thread1305005.html
У меня есть одна программа на C++. В ней следовательно есть несколько переменных (например int i = 3 и String c = "test"). Необходимо создать программу на C++ Builder 6.0, которая сможет: 1. Получить список всех переменных программы. 2. Изменить переменные. 3. Прочитать переменные. И 2 вопрос: можно ли сделать две программы (именно программы, не формы) с общими переменными?
C++ Работа с XML файлами в Builder С++ Добрый день, уважаемые форумчане! Подскажите какие-нибудь учебники по работе с XML файлами в Builder С++. ПОЖАЛУЙСТА! в интернете ничего путного не нашла...А если кому не жалко, можете скинуть исходник подробнее

Показать сообщение отдельно
Ilot
Модератор
Эксперт С++
1810 / 1167 / 227
Регистрация: 16.05.2013
Сообщений: 3,075
Записей в блоге: 5
Завершенные тесты: 1
19.11.2014, 16:09
Добавил в класс Student оператор присвоения:
Кликните здесь для просмотра всего текста
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
142
143
144
145
146
147
148
149
150
#include<iostream>
#include <cstring>
#define CHAR_LENGTH 200
#define NOTHING_FOUND -1
 
class Student {
private:
    char* name;
    char* lastName;
    int iq;
 
    void init() {
        name = new char[CHAR_LENGTH] {};
        lastName = new char[CHAR_LENGTH] {};
    }
 
public:
    Student() {
        init();
        iq = 0;
    }
 
    Student(char* _name, char* _lastName, int _iq) {
        init();
        strncpy(name, _name, strlen(_name));
        strncpy(lastName, _lastName, strlen(_lastName));
        iq = _iq;
    }
 
    ~Student() {
        delete[] name;
        delete[] lastName;
    }
 
    char* getName() {
        return name;
    }
 
    char* getLastName() {
        return lastName;
    }
 
    int getIq() {
        return iq;
    }
 
    bool equals(Student* student) {
        return  strncmp(name, student->name, CHAR_LENGTH) == 0 &&
            strncmp(lastName, student->lastName, CHAR_LENGTH) == 0 &&
            iq == student->iq;
    }
 
    void show() {
        using namespace std;
        cout << "Name: " << name << " Last name: " << lastName << " IQ: " << iq << endl;
    }
    Student& operator= (const Student& st) {
        strncpy(name, st.name, strlen(st.name));
        strncpy(lastName, st.lastName, strlen(st.lastName));
        iq = st.iq;
        return *this;
    }
};
 
class Group {
private:
    Student* students;
    int groupSize;
    int currentSize;
 
    void init(int _groupSize) {
        students = new Student[_groupSize];
        groupSize = _groupSize;
        currentSize = 0;
    }
 
    int findStudent(Student* student) {
        for (int i = 0; i < currentSize; i++) {
            if (students[i].equals(student)) {
                return i;
            }
        }
 
        return NOTHING_FOUND;
    }
 
public:
    Group() {
        init(20);
    }
 
    Group(int groupSize) {
        init(groupSize);
    }
 
    ~Group() {
        delete[] students;
    }
 
    bool addStudent(Student* student) {
        if (currentSize >= groupSize) {
            return false;
        }
        students[currentSize++] = *student;
 
        return true;
    }
 
    bool removeStudent(Student* student){
        return removeStudent(findStudent(student));
    }
 
    bool removeStudent(int index) {
        if (index < 0 || index >= currentSize) {
            return false;
        }
 
        for (int i = index; i < currentSize - 1; i++)
        {
            std::swap(students[i], students[i + 1]);
        }
        --currentSize;
        return true;
    }
 
    void show() {
        for (int i = 0; i < currentSize; i++) {
            students[i].show();
        }
    }
};
 
int main(){
    Student vasya("Vasya", "Pipkin", 1200);
    Student petya("Petya", "Pupkin", 100);
    Student grisha("Grigoriy", "Vasechkin", -500);
 
    Group group(5);
    group.addStudent(&vasya);
    group.addStudent(&petya);
    group.addStudent(&grisha);
 
    group.show();
 
    group.removeStudent(&vasya);
 
    group.show();
    //system("pause");
    return 0;
}

Вот здесь:
C++
1
2
3
4
5
6
    Student& operator= (const Student& st) {
        strncpy(name, st.name, strlen(st.name));
        strncpy(lastName, st.lastName, strlen(st.lastName));
        iq = st.iq;
        return *this;
    }
C++
1
2
3
4
5
6
7
8
    bool addStudent(Student* student) {
        if (currentSize >= groupSize) {
            return false;
        }
        students[currentSize++] = *student;
 
        return true;
    }
И вот здесь:
C++
1
2
3
4
5
6
7
8
    bool addStudent(Student* student) {
        if (currentSize >= groupSize) {
            return false;
        }
 
        students[currentSize++] = Student(student->getName(), student->getLastName(), student->getIq());
        return true;
    }
У вас происходила неприятная вещь. Указатели теперь стали указывать на один и тот же участок памяти, что приводило к падению программы при вызове деструкторов. Инкапсулируйте динамически выделяемые учаски памяти.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru