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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KostyaKulakov
Заблокирован
#1

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

10.03.2013, 11:33. Просмотров 247. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2013, 11:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Исправить оишбку в коде (C++):

Исправить ошибки в коде - C++
#include &lt;iostream&gt; #include &lt;Windows.h&gt; #include &lt;conio.h&gt; using namespace std; void MessageBo() { int MB_1 =...

Исправить ошибки в коде - C++
Доброй вечер программисты. Пожалуйста помогите исправить ошибку в задаче. Если ввести матрицу 2x2, и ее эл-ты равны -1 -1 и -1 -1...

Исправить ошибку в коде - C++
Вроде веденно всё правильно но выдаёт ошибку: #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { ...

Исправить ошибки в коде - C++
пишу программу при компиляции ошибки main.cpp(19) : warning C4508: 'main' : function should return a value; 'void' return type...

Исправить ошибки в коде - C++
Пожалуйста помогите исправить ошибки Первая часть кода (вторая в комментариях) #define _CRT_SECURE_NO_WARNINGS #include...

Исправить ошибку в коде - C++
где ошибка? #include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; int main () { setlocale(LC_ALL,&quot;Russian&quot;); double...

4
SummerRain
326 / 325 / 17
Регистрация: 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
alsav22
5421 / 4816 / 442
Регистрация: 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
KostyaKulakov
Заблокирован
15.03.2013, 11:18  [ТС] #4
собственно, я смотрел в отладки, после выхода из функции, вызывался деструктор, такой вопрос. зачем тут конструктор копирования?
0
alsav22
5421 / 4816 / 442
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2013, 14:02
Привет! Вот еще темы с ответами:

Исправить ошибку в коде - C++
помогите найти ошибку . студия 2012 #include &lt;iostream&gt; #include &quot;queue.h&quot; using namespace std; int main() { Queue a,c;...

Исправить ошибку в коде с++ - C++
Помогите исправить ошибку в коде: CString m_showlink; CRec1-&gt;GetFieldValue(&quot;Ïóòü&quot;,CValue); m_showlink = CValue.pbVal; ...

исправить ошибку в коде - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &lt;locale.h&gt; #include &lt;stdlib.h&gt; #define OUTPUT_FILE...

Исправить ошибки в коде - C++
Возникла проблема при написании программы. Выдаются ошибки которых нет на самом деле. помогите, пожалуста. код Parcer::Parcer() { ...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
15.03.2013, 14:02
Ответ Создать тему
Опции темы

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