Заблокирован
1

Исправить оишбку в коде

10.03.2013, 11:33. Показов 447. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Код:
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
#include <stdio.h>
#include <iostream>
#include <string>
class Unit
{
public:
    Unit(const char* name, int hitpoints, int damage)
    : hitpoints_(hitpoints), damage_(damage)
    {
        if(name != nullptr)
        {
            name_ = new char[strlen(name) + 1];
            strcpy(name_, name);
        }
    }
 
    ~Unit()
    {
        delete [] name_;
    }
 
    char* name_;
    int hitpoints_;
    int damage_;
};
 
 
void ShowStats(Unit unit)
{
    std::cout << unit.name_ << " - " << unit.hitpoints_ << " - " << unit.damage_;
}
int main()
{
    Unit marine("marine", 45, 6);
 
    ShowStats(marine);
    // Game cycle...
    ShowStats(marine);
 
    return 0;
}
ошибка в деструкторе, не могу его правильно написать.. самое главное, нельзя нечего убирать. можно только добавлять, а убирать нельзя.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2013, 11:33
Ответы с готовыми решениями:

Выводит стандарт. оишбку несмотря на Try-Except
try mediaPlayer2.FileName:=ListBox2.Items.Strings; mediaPlayer2.Open; except ...

Как исправить исправить ошибку в коде
Здравствуйте,помогите пожалуйста исправить ошибку в коде.using System; using System.Threading; ...

Исправить ошибку в коде
Что не так? задание: Написать подпрограмму для вычисления ординаты точки М(х,у), принадлежащей...

Исправить недочеты в коде
var T : Text; a, b, h, x: real; y1, y2, y3, y1_1, y1_2, y1_3: real; function F(x, y1, y2,...

4
328 / 327 / 92
Регистрация: 16.12.2012
Сообщений: 544
10.03.2013, 12:32 2
добавьте конструктор копирования
C++
1
2
3
4
5
Unit(const Unit& u)
    {
        name_ = new char[strlen(u.name_) + 1];
        strcpy(name_, u.name_);
    }
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
10.03.2013, 14:09 3
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
ошибка в деструкторе, не могу его правильно написать.. самое главное, нельзя нечего убирать. можно только добавлять, а убирать нельзя.
В чём ошибка в деструкторе?
C++
1
2
3
4
void ShowStats(Unit &unit)
{
    cout << unit.name_ << " - " << unit.hitpoints_ << " - " << unit.damage_ << endl;
}
1
Заблокирован
15.03.2013, 11:18  [ТС] 4
собственно, я смотрел в отладки, после выхода из функции, вызывался деструктор, такой вопрос. зачем тут конструктор копирования?
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
15.03.2013, 14:02 5
Деструктор здесь не при чём. Вы передаёте в функцию объект по значению, из-за этого проблемы. Память под копией name_ освобождается. Потом опять вызов функции, опять создаётся копия name_, по адресу в name_ уже муссор (что и выводится), при выходе из функции попытка освободить уже освобождённую память. Или передавайте объект по ссылке, или сделайте эту функцию методом класса.

Добавлено через 1 час 25 минут
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
зачем тут конструктор копирования?
Потому что конструктор копирования по умолчанию делает поверхностное копирование, т.е. просто копирует поля класса. Если там указатель, то копируется сам указатель, а не то, на что он указывает. В таких случаях определяют конструктор для глубокого копирования. Тогда у временных объектов будут свои указатели и своя память под ними, и не будет двойного освобождения памяти, как в этом случае.
Добавляете вот такой конструктор копирования и ошибка исчезнет:
C++
1
2
3
4
5
6
7
Unit(const Unit &obj)
{
    hitpoints_ = obj.hitpoints_;
    damage_ = obj.damage_;
    name_ = new char[strlen(obj.name_) + 1];
    strcpy(name_, obj.name_);
}
1
15.03.2013, 14:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2013, 14:02
Помогаю со студенческими работами здесь

Исправить ошибки в коде
В чем тут ошибка не пойму, все как по книге написал!

Исправить ошибки в коде
Возникла проблема при написании программы. Выдаются ошибки которых нет на самом деле. помогите,...

Исправить ошибку в коде
Помогите исправить ошибку в коде программы. #include &lt;iostream.h&gt; #include &lt;string.h&gt; #include...

Исправить ошибки в коде
Dim Банк As Long Dim Партия As Long Dim НомерМаксимум As Long Dim НомерМинимум As Long Dim...


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

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

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