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

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

Войти
Регистрация
Восстановить пароль
 
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
#1

Класс линия - C++

24.01.2013, 18:28. Просмотров 743. Ответов 13
Метки нет (Все метки)

Задание: описать класс линии, в котором конструктор ещё и рисует её. (это сделано). Доп. задание: сделать деструктор. вопрос: как? просто длину занулить или что?

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
# include <iostream>
using namespace std;
 
class line
{
    int len;
public:
    line(int a);
    
};
 
line :: line(int a){
    len=a;
    for (int i = 0; i < len; ++i)
    {
        cout<<"*";
    }
    cout<<"\n";
}
 
 
 
int main()
{
    cout<<"Insert line's length:\n";
    int l;
    cin>>l;
    line L1(l);
 
    return 0;
    cin.ignore(); cin.get();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
24.01.2013, 18:41     Класс линия #2
Можно сделать чтобы очищал консоль:
C++
1
2
3
line :: ~line(){
    system("cls");
}
И можно было бы лучше если бы return 0; после cin.get(); поставить:
C++
1
2
3
    cin.ignore();
    cin.get();
    return 0;
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
24.01.2013, 18:48  [ТС]     Класс линия #3
класс, про чистку консоли не знал, спасибо)
extenup
53 / 53 / 3
Регистрация: 12.11.2011
Сообщений: 109
24.01.2013, 18:51     Класс линия #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
42
43
44
45
46
# include <iostream>
using namespace std;
 
class line
{
    int len;
    char *arrLine;
 
public:
    line(int a);
    ~line();
 
    void draw();
 
};
 
line :: line(int a)
{
    len=a;
    arrLine = new char[len]();
    for (int i = 0; i < len; ++i)
        arrLine[i] = '*';
}
line::~line()
{
    delete[] arrLine;
}
 
void line::draw()
{
    for(int i = 0; i < len; i++) cout << arrLine[i];
    cout << endl;
}
 
 
int main()
{
    cout<<"Insert line's length:\n";
    int l;
    cin>>l;
    line L1(l);
    L1.draw();
 
    cin.ignore(); cin.get();
    return 0;
}
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,940
Записей в блоге: 2
Завершенные тесты: 1
24.01.2013, 19:13     Класс линия #5
Цитата Сообщение от Dummy_1 Посмотреть сообщение
класс, про чистку консоли не знал, спасибо)
Лучше "стирать" не весь экран, а только заданную линию.
The_bolT
70 / 70 / 1
Регистрация: 22.01.2013
Сообщений: 231
24.01.2013, 19:27     Класс линия #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Лучше "стирать" не весь экран, а только заданную линию.
Кстати, как так сделать, чтобы не всю консоль стереть а только линию?
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
24.01.2013, 19:31  [ТС]     Класс линия #7
Цитата Сообщение от extenup Посмотреть сообщение
Тебе в классе не нужен деструктор, так-как у тебя в классе нет динамического выделения памяти. Вот если класс в себе хранит массив "точек" тогда их надо будет удалять в деструкторе чтобы не утекла память. Вот твой пример, немного переделанный (тут динамически создаётся массив "точек" и удаляется в деструкторе).
спасибо, там в доп. задании сказано сделать деструктор. мой вопрос "или что?" также подразумевал, надо ли перекраивать прогу под дин.память.
кстати есть ли на форуме где можно разобраться с динамическим выделением памяти в С++? я принцип понимаю, но синтаксиса не знаю. заранее спасибо
extenup
53 / 53 / 3
Регистрация: 12.11.2011
Сообщений: 109
24.01.2013, 20:44     Класс линия #8
С динамическим выделением всё очень просто. Если выделяешь память оператором new для 1-го объекта то потом его удаляешь через оператор delete. Если же ты выделяешь память под массив - то потом удаляешь оператором delete[].

И ещё. Если у тебя в классе есть поля для которых память выделяется динамически- то её обязательно надо освобождать в деструкторе. Чтобы при удалении класса были удалены все объекты которые он динамически создал.

C++
1
2
3
4
5
6
7
8
9
//...
 
MyClass *myClass = new MyClass(); // Выделил динамически память под объект
delete myClass; // Освободил память когда он тебе уже не нужен
 
MyClass *myClasses = new MyClass[256](); // Выделил динамически память под массив объектов
delete[] myClasses; // Освободил память когда он тебе уже не нужен
 
//...
Dummy_1
2 / 2 / 0
Регистрация: 22.01.2013
Сообщений: 59
24.01.2013, 20:52  [ТС]     Класс линия #9
в книжке, по которой я учу используются операторы malloc и free. вы предлагаете использовать new и delete. как лучше?
MrGluck
Ворчун
Эксперт CЭксперт С++
6614 / 3805 / 495
Регистрация: 29.11.2010
Сообщений: 10,044
24.01.2013, 20:57     Класс линия #10
Dummy_1, malloc и free пережиток из С. Если вы хотите программировать на С++, использовать классы и т.д. то только new и delete. И неужели вам нравится каждый раз указывать тип данных?

Сразу скажу, что использовать malloc с delete или new с free в паре нельзя.
extenup
53 / 53 / 3
Регистрация: 12.11.2011
Сообщений: 109
24.01.2013, 20:58     Класс линия #11
Цитата Сообщение от Dummy_1 Посмотреть сообщение
в книжке, по которой я учу используются операторы malloc и free. вы предлагаете использовать new и delete. как лучше?
Смотря на чём будешь писать. malloc и free - это выделение памяти для языка 'C' , а new и delete для 'C++'
Croessmah
Модератор
Эксперт CЭксперт С++
12877 / 7263 / 810
Регистрация: 27.09.2012
Сообщений: 17,940
Записей в блоге: 2
Завершенные тесты: 1
24.01.2013, 23:13     Класс линия #12
Цитата Сообщение от Dummy_1 Посмотреть сообщение
в книжке, по которой я учу используются операторы malloc и free. вы предлагаете использовать new и delete. как лучше?
malloc выделяет сырую память, в отличие от new
DU
1480 / 1056 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
24.01.2013, 23:36     Класс линия #13
чтобы стереть линию, достаточно нарисовать ее не звездочками, а пробелами.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.01.2013, 12:55     Класс линия
Еще ссылки по теме:

Прямая линия на плоскости C++
C++ Побочная линия
Определить, имеет ли ломаная линия самопересечения C++
Создать класс Point (точка). На его основе создать классы ColoredPoint и Line (линия) C++
Реализовать иерархию классов Точка-Линия-Круг C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт С++
4956 / 3032 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
29.01.2013, 12:55     Класс линия #14
Цитата Сообщение от extenup Посмотреть сообщение
Тебе в классе не нужен деструктор, так-как у тебя в классе нет динамического выделения памяти
Одно с другим не связано. Деструктор совершает финализацию, которая необходима перед фактическим уничтожением объекта. Ведь закрытие файла напрямую не связано с очисткой выделенной памяти (хотя ясное дело, где-то в дебрях библиотечного кода при открытии файла некоторая память выделяется, но если учитывать абстракцию, то программисту не важно, как это происходит внутри; ему важно, что когда он просит открыть файл, то файл открывается), однако поместить данную операцию в деструктор не будет неправильным.
Так что если логика приложения требует, чтобы при уничтожении объекта уничтожалась вся информация, связанная с ним (в данном случае визуальное отображение объекта в виде линии на экране), то данные действия следует поместить именно в деструктор (напрямую или косвенно, через метод скрытия линии с экрана, например).

Добавлено через 10 минут
Если уточнить это:
Цитата Сообщение от Croessmah Посмотреть сообщение
malloc выделяет сырую память, в отличие от new
то главное отличие malloc от new - malloc не вызывает конструктор объекта, поскольку для выделения памяти не использует информацию о типе, а только о количестве требуемых байтов.
Вообще, если хочется, чтобы деструктор вызывался, без new не обойтись. Обычную последовательность new-delete можно заменить последовательностью malloc-placement new-destructor call-free примерно так:
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
#include <iostream>
#include <cstdlib>
 
class Foo
{
public:
    Foo()
    {
        std::cout << "Foo::Foo()" << std::endl;
    }
    
    ~Foo()
    {
        std::cout << "Foo::~Foo()" << std::endl;
    }
};
 
int main()
{
    Foo *bar1 = new Foo();
    
    delete bar1;
    
    Foo *bar2 = static_cast<Foo *>(malloc(sizeof(Foo)));
    new (bar2) Foo();
    
    bar2->~Foo();
    free(bar2);
    
    return 0;
}
http://liveworkspace.org/code/2NcCvT$1
Как видно по выполнению кода, результаты выполнения обычного new-delete и malloc-free аналогичны. Однако никакого смысла или выгоды в этом не вижу. Placement new хорош при написании собственных менеджеров памяти, когда необходимо разнести операции выделения памяти и вызова конструктора, а также операции вызова деструктора и освобождения памяти.
Yandex
Объявления
29.01.2013, 12:55     Класс линия
Ответ Создать тему
Опции темы

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