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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
#1

new/delete + конструктор/деструктор - C++

04.02.2013, 18:10. Просмотров 1133. Ответов 19
Метки нет (Все метки)

Приветствую знатоков превеликого C++. Если возможно, объясните пожалуйста чайнику, сей момент. Я не могу понять как выделять память под данные. Выделяться/очищаться она должна в конструкторе/деструкторе. В конструкторе параметров несколько, для каждого нужно прописывать new? (Сколько я не искала примеров конструкторов с несколькими параметрами, попадались максимум с двумя и память выделялась только под первый.) Опять же, если конструктор работает, значит параметры к нему уже пришли, а это значит, что эти данные память себе уже отожрали. Если выделять память в main() через указатель... он указывает на адрес начала выделенной памяти (ведь так?). Да и когда мы её выделяем, нужно прописывать тип данных, а у меня они разнотипные. Разве может быть массив разнотипных данных?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2013, 18:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос new/delete + конструктор/деструктор (C++):

Конструктор инициализации, конструктор копирования, деструктор - C++
Я сделал почти задание по перегрузке операторов. Осталось одно, тоесть три: конструктор инициализации, конструктор копирования, деструктор....

Создать класс "Вектор" и реализовать конструктор по умолчанию, конструктор копирования и деструктор - C++
Всем доброго времени суток! нужна ваша помощь! нужно создать класс вектор и реализовать конструктор по умолчанию, копирования и...

конструктор и деструктор - C++
помоги пожалуйста написать программу в которой создаются и разрушаются объекты определенного пользовательского класса.Выполнить...

Конструктор/деструктор - C++
Подскажите пожалуйста как внедрить в вот эту программу конструктор и деструктор... В программе есть базовый класс (летательные аппараты)...

Конструктор и деструктор - C++
На сколько сильно они нужны и можно ли обойтись без них? Что будет если их не описывать? Что такое утечки памяти? Память забивается...

Конструктор, деструктор - C++
Дорогие друзья, программисты. Помогите пожалуйста разобраться с конструктором и деструктором, а так же перегрузкой. Фотография прилагается...

19
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2013, 18:18 #2
WolfSpirit, на самом деле вы разберетесь с этим, когда сталкнетесь. Т. е. появится необходимость. Ответить на Ваши вопросы врядли кто сможет.
0
m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,262
Завершенные тесты: 2
04.02.2013, 18:27 #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Some  {
public:
    Some(int n)  {
        cout << "Construct: " << this << endl;
        size = n;
        data = new int[size];
    }
    ~Some()  {
        cout << "Destruct: " << this << endl;
        delete []data;
    }
private:
    int *data;
    int size;
};
 
int main()  {
    Some arr(50);
    
    return 0;
}
Если честно не совсем понял суть вопроса...
0
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 18:33  [ТС] #4
Ладно, давайте по другому.

classes.h
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef R_4_H
#define R_4_H
 
#include <QString>
 
class head {
    QString name; // название
    QString color; // цвет
    bool move; // возможность движения части тела
    bool addition; // наличие дополнений (глаза/уши/рот/и т.д.)
    double weight; // вес (кг)
    double cost; // стоимость ($)
public:
    head();
    head(QString name, QString color, bool move,
         bool addition, double weight, double cost);
    ~head();
    void show();
};
 
#endif // R_4_H

def.cpp
C++ (Qt)
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
#include "classes.h"
#include <QTextStream>
 
QTextStream cout(stdout);
 
void out(bool x) {
    if (x==0) cout << "No" << endl;
    else cout << "Yes" << endl;
}
 
head::head() {
    cout << "Head" << endl;
}
 
head::head(QString name, QString color, bool move,
           bool addition, double weight, double cost) {
    cout << "Headshot" << endl;
    this->name = name;
    this->color = color;
    this->move = move;
    this->addition = addition;
    this->weight = weight;
    this->cost = cost;
}
 
head::~head(){
    cout << "Delete..." << endl;
 
}
 
void head::show() {
    cout << "Head: " << name << endl;
    cout << "Color: " << color << endl;
    cout << "Move: "; out(move);
    cout << "Addition: "; out(addition);
    cout << "Weight: " << weight << " kg." << endl;
    cout << "Cost: " << cost << " $" << endl;
}

main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "classes.h"
#include "def.cpp"
 
int main()
{
    //head h1;
    //h1.show();
 
    head h2("Steel Hammer", "Black", false, true, 13.4, 348.57);
    h2.show();
 
    return 0;
}
Что, где, куда?
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2013, 18:36 #5
WolfSpirit, что Вас смущает?
0
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 18:41  [ТС] #6
Цитата Сообщение от go Посмотреть сообщение
WolfSpirit, что Вас смущает?
Смущает то, что я не знаю где и как в конструкторе выделять память. 6 параметров, 3 вида входящих данных. И это только первая "голова", дальше их будет больше.

В конструкторе для каждого параметра (переменной) нужно выделять память? Или для всех сразу? И вообще в конструкторе ли это надо делать? Я уже не знаю как объяснить, что мне непонятно.
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2013, 18:52 #7
Цитата Сообщение от WolfSpirit Посмотреть сообщение
выделять память
Что Вы понимаете под этим?
0
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 18:58  [ТС] #8
Цитата Сообщение от go Посмотреть сообщение
Что Вы понимаете под этим?
Вот у меня данные -> ("Steel Hammer", "Black", false, true, 13.4, 348.57), я полагаю под них нужно выделять память? Дальше их будет больше. Это только один объект класса (или как правильно?). А если их будет 10? Если не ошибаюсь, выделение памяти будет как-то связано с указателем(-лями). Возможно мы делаем указатель на выделенную память, а потом ему передаём ссылку на данные (сначала на одни, потом на другие). Но где они до этого будут хранится? По моему, чем больше я пытаюсь объяснить, что мне непонятно, тем больше я вас запутываю.
0
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
04.02.2013, 19:03 #9
Сначала освойте где могут жить обьекты и переменные (ДП, стек, глобальная память).
Область видимости и время жизни тоже не мало значат.

Можно понять пример но теория важнее!
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.02.2013, 19:08 #10
Цитата Сообщение от WolfSpirit Посмотреть сообщение
head::head(QString name, QString color, bool move,
* * * * * *bool addition, double weight, double cost) {
При такой передаче помять выделяется на стэке. Туда заносится копия значений.

Цитата Сообщение от WolfSpirit Посмотреть сообщение
class head {
* * QString name; // название
* * QString color; // цвет
* * bool move; // возможность движения части тела
* * bool addition; // наличие дополнений (глаза/уши/рот/и т.д.)
* * double weight; // вес (кг)
* * double cost; // стоимость ($)
Память выделяется при создании объекта.


Вот смотрите

C++
1
2
int a; // Я выделил память на стэке под переменную.
a = 10; // занес туда значение
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *p; // я объявил указатель. Под него тоже выделена память. Но он !!указывает!! на какой-то мусор
 
a = 10; // так писать не правильно. По смыслу не подходит. Мы задаем какой-то адрес 0х0А в своем адресном пространстве
 
*a = 10; //так присваиваем значение какой-то области памяти, куда указывает указатель.
// но будет ошибка, т.к. как мы не выделили память под него, и он портит чужую
 
a = new int; // выделили память, и вернули указатель на начало ее.
 
*a = 10; // OK
 
delete a; // освобождаем память, чтобы избежать утечки, когда в ней нет необходимости
0
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 19:29  [ТС] #11
Цитата Сообщение от go Посмотреть сообщение
Вот смотрите
Плохо, быть лохом. С одной переменной, мне вроде ясно. Но как следует поступить в моём случае, чтобы экономить память? Данных будет много. Для каждого объекта её нужно будет выделять заново? Если она выделяется автоматом, может её можно просто освобождать? Я не требую конкретного ответа, но хоть задайте направление (книги, ссылки) где, что искать. Самостоятельно додуматься я не могу. Это огромная проблема. Неужели у всех всё легко получалось и все сразу всё понимали?
0
Dr.Urban
63 / 58 / 7
Регистрация: 14.12.2011
Сообщений: 193
04.02.2013, 20:26 #12
Цитата Сообщение от WolfSpirit Посмотреть сообщение
Неужели у всех всё легко получалось и все сразу всё понимали?
Грабли у каждого свои. Посмотри предыдущие темы, может найдешь чтото для себя.

Как говорят индусы "зачем економить память - купим еще, она дешевая". Может проблема не там где ищете?
0
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 20:30  [ТС] #13
Цитата Сообщение от Dr.Urban Посмотреть сообщение
Может проблема не там где ищете?
Проблема в отсутствии мозга и наличии жгучего желания понять. Я пересмотрела несколько книг, туеву хучу ссылок по данной теме, но толку 0. Не идёт и всё тут. Видимо это не всем дано. Либо моё желание не настолько жгучее, как я считаю.
0
Герц
524 / 341 / 4
Регистрация: 05.11.2010
Сообщений: 1,077
Записей в блоге: 1
04.02.2013, 20:58 #14
Ничего выделять не нужно.
0
WolfSpirit
0 / 0 / 0
Регистрация: 04.02.2013
Сообщений: 9
04.02.2013, 21:01  [ТС] #15
Цитата Сообщение от Герц Посмотреть сообщение
Ничего выделять не нужно.
А поподробнее можно? Будет куча данных -> займёт много памяти. Не выделять, так освобождать надо. А delete, без new не сработает.
0
04.02.2013, 21:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2013, 21:01
Привет! Вот еще темы с ответами:

Конструктор и деструктор - C++
Нужно чтобы деструктор отработал до завершения программы #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cstring&gt; #include...

С++. Конструктор, деструктор - C++
Ребята!!! Помогите пожалуйста, не знаю как сделать это задание на С++. Нужно разработать класс Point для работы с пользовательским...

Конструктор и деструктор - C++
Всем привет! В программе не работает конструктор с параметрами! Можете подсказать чего я не так делаю? Задание: есть класс изделия,...

Конструктор и деструктор - C++
Всем привет.Вообщем передо мной стоит такая задача-Отобразить на экране время работы программы, используя конструктор и деструктор.В...


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

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

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