Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деструктор 
V
    Опции темы
azer88
Дата 5.12.2010, 05:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.11.2007

Репутация: нет
Всего: нет



Код

#include<iostream>

using namespace std;

class polygon{
protected:
    double perimeter;
    unsigned int nsides,size;
    float *sides;
public:
    polygon();
    polygon(int);
    polygon(int ns,float *s);
    ~polygon();
};
polygon::polygon()
{

    perimeter=nsides=size=0;
    sides=new float[0];
}
polygon::polygon(int s){

    perimeter=nsides=0;
    size=s;
    sides=new float[s];
}
polygon::polygon(int ns,float *s){

    perimeter=0;
    nsides=size=ns;
    sides=new float[ns];
    for (int i=0; i<ns; i++)
        perimeter+=(sides[i]=s[i]);
}
polygon::~polygon()
{

delete[] sides;
}

class triangle:public polygon{
public:
    triangle(float,float,float);
    triangle(int,float*);
    ~triangle();
};
triangle::triangle(float a,float b, float c):polygon(3){

    sides[0]=a;
    sides[1]=b;
    sides[2]=c;
    perimeter=a+b+c;
    cout<<perimeter;
}
triangle::triangle(int n,float *s):polygon(n,s){
}
triangle::~triangle()
{

    delete[] sides;
}

int main()
{
    float a[]={2,3,4};
    triangle t(1,2,3);
    triangle u(3,a);
    return 0;
    }


Мне нужно найти ошибку в коде и исправить. Я думал что ошибка здесь.
Код

delete[] sides;

Когда удаляю етот код(в деструкторе полигона) всё работает нормално но учитель сказал что это не провилный ответ.
PM MAIL   Вверх
Игорь1024
Дата 5.12.2010, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 151
Регистрация: 11.5.2009
Где: Дальний Восток

Репутация: нет
Всего: нет



Код

sides=new float[0];

Это как?
Нулевой размер?

Это сообщение отредактировал(а) Игорь1024 - 5.12.2010, 06:01
--------------------
The God is real,unless he is declared as integer.
PM MAIL   Вверх
Crafty
Дата 5.12.2010, 06:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Вообщем проблема в том что ты используешь два раза delete, если производный класс не выделяет динамически память, то и деструктор не должен ничего удалять.
Код

#include<iostream>
using namespace std;
class polygon{
protected:
    double perimeter;
    unsigned int nsides,size;
    float *sides;
public:
    polygon();
    polygon(int);
    polygon(int ns,float *s);
    virtual ~polygon(); // в базовом классе при наследовании нужно использовать виртуальный деструктор
};
polygon::polygon(): perimeter(0), nsides(0), size(0), sides(NULL) // используй список инициализации
{
}
polygon::polygon(int s): perimeter(0), nsides(0), size(s), sides(new float[s]) 
{
}
polygon::polygon(int ns,float *s){
    perimeter=0;
    nsides=size=ns;
    sides=new float[ns];
    for (int i=0; i<ns; i++)
        perimeter+=(sides[i]=s[i]);
}
polygon::~polygon()
{
    delete[] sides;
}
class triangle:public polygon{
public:
    triangle(float,float,float);
    triangle(int,float*);
    ~triangle();
};
triangle::triangle(float a,float b, float c):polygon(3){
    sides[0]=a;
    sides[1]=b;
    sides[2]=c;
    perimeter=a+b+c;
    cout<<perimeter; // лучше сделай отдельную ф-цию член для вывода периметра
}
triangle::triangle(int n,float *s):polygon(n,s){
}
triangle::~triangle()
{
}
int main()
{
    float a[]={2,3,4};
    triangle t(1,2,3);
    triangle u(3,a);
    return 0;
}


Это сообщение отредактировал(а) Crafty - 5.12.2010, 06:07
PM MAIL   Вверх
azer88
Дата 5.12.2010, 06:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.11.2007

Репутация: нет
Всего: нет



Не думаю что проблема там. Потому что нам в этом случае этот код не нужен(default constractor)
PM MAIL   Вверх
Crafty
Дата 5.12.2010, 06:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Цитата(azer88 @  5.12.2010,  05:28 Найти цитируемый пост)
Когда удаляю етот код(в деструкторе полигона) всё работает нормално но учитель сказал что это не провилный ответ. 

этот код нужно удалить в деструкторе треугольника.

Использовать список инициализации - это просто совет, тут нету ошибки.


Это сообщение отредактировал(а) Crafty - 5.12.2010, 06:16
PM MAIL   Вверх
azer88
Дата 5.12.2010, 06:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 52
Регистрация: 18.11.2007

Репутация: нет
Всего: нет



Crafty, большое спасибо. но есть один вопрос. какая разница между списками инициализации и кодом которым я написал?

Код

polygon::polygon(): perimeter(0), nsides(0), size(0), sides(NULL) // используй список инициализации
{
}
polygon::polygon(int s): perimeter(0), nsides(0), size(s), sides(new float[s]) 
{
}



Код

polygon::polygon()
{

    perimeter=nsides=size=0;
    sides=new float[0];
}
polygon::polygon(int s){

    perimeter=nsides=0;
    size=s;
    sides=new float[s];
}


PM MAIL   Вверх
Crafty
Дата 5.12.2010, 06:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Цитата(azer88 @  5.12.2010,  06:18 Найти цитируемый пост)
какая разница между списками инициализации и кодом которым я написал?

Дело в том что работу конструтора можно разделить на два этапа - первый это инициализация( которая происходит всегда, независимо от того есть список переменных членов или нету), вторая это уже выполнение тела конструктора.
То есть у нас получается что, сначала переменные члены инициализируются значениями, а потом мы присваиваем им новые значения. Следовательно лучше их сразу инициализировать, а тело конструктора оставить пустым.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.