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

Обращение к методу объекта размещенного в динамической памяти - C++

Восстановить пароль Регистрация
 
andrew_fg
 Аватар для andrew_fg
0 / 0 / 0
Регистрация: 29.03.2013
Сообщений: 6
30.03.2013, 00:01     Обращение к методу объекта размещенного в динамической памяти #1
Я начинающий C++ ученик, изучил базовые классы, указатели и дошел до темы размещения объектов в динамической памяти.

В экспериментах по программированию возникла одна проблемка.

Я создал класс (cPoint) сохраняющий координаты точки (x, y). Этот класс используется в другом классе (cRectangle).

При размещении в стеке (данных объекта) все работает на ура.

После я переделываю все под размещение данных объектов в динамической памяти - Данные и обращения к ним, конструкторы и деструкторы.

Короче, при размещении данных объекта в стеке, в основной функции в main() было такое выражение:

myRectangle->getUpperLeft().getX()

и все работало на ура (возвращало нужное значение). Но когда я переделываю данные класса под размещение в динамической памяти начинаются проблемы.

Или я что-то во всем этом недопонял. Нужно ли внутри классов пытаться разместить данные в динамической памяти или достаточно того что весь объект размещается в ней.

На всякий случай разместил оба варианта проекта (на Яндекс.Диске):

multiclass-stek - это когда все работает, и
multiclass-dynamic когда классы подправлены под размещение данных в динамической памяти
(и программа перестает работать корректно).

Функция main() находится в файле multiclass.cpp (в обоих проектах)

IDE VisualStudio 2010.

Поможите разобраться, кто может, Люди Добрые! Пожалуйста! Хотелось бы догнать эту тему.
Спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
supra7sky
 Аватар для supra7sky
15 / 15 / 1
Регистрация: 07.02.2013
Сообщений: 123
30.03.2013, 00:35     Обращение к методу объекта размещенного в динамической памяти #2
Если вы внутри класса используете динамическое выделение и освобождение памяти, то обязательно изучите конструкторы копий и проблемы, которые возникают при передаче объектов в функции, возврата из нее, присваивания.

Например если объект в котором для членов выделена память, передается в функцию, то создается его копия и как известно при завершении работы ф-ии все ее автоматические переменные и объекты выходят из области видимости. Следовательно срабатывает деструктор, который освобождает память по адресу объекта и выходят ошибки.

Попробуйте убрать полностью деструкторы и если все будет работать, значит проблема в этом.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 04:31     Обращение к методу объекта размещенного в динамической памяти #3
Создать конструктор копирования:
C++
1
2
3
4
5
6
7
cPoint(const cPoint &cPnt);
 
cPoint::cPoint(const cPoint &cPnt)
{
    itsX = new int(*cPnt.itsX);
    itsY = new int(*cPnt.itsY);
}
Миниатюры
Обращение к методу объекта размещенного в динамической памяти  
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 05:33     Обращение к методу объекта размещенного в динамической памяти #4
Определить оператор присваивания:
C++
1
2
3
4
5
6
7
8
9
cPoint& operator=(const cPoint &cPnt);
 
cPoint& cPoint::operator=(const cPoint &cPnt)
{
    if (this == &cPnt) return *this;
    *itsX = *cPnt.itsX;
    *itsY = *cPnt.itsY;
    return *this;
}
Проблемы были из-за функций, которые возвращали объекты cPoint по значению (getUpperLeft() и пр.):
C++
1
2
3
4
cPoint cRectangle::getUpperLeft   () const
{
    return *itsUpperLeft;
}
Здесь работал конструктор копирования по умолчанию. Можно обойтись без явного конструктора копирования, если возвращать объекты, в этих функциях, по ссылке:
C++
1
2
3
4
cPoint& cRectangle::getUpperLeft   () const
{
    return *itsUpperLeft;
}
andrew_fg
 Аватар для andrew_fg
0 / 0 / 0
Регистрация: 29.03.2013
Сообщений: 6
30.03.2013, 09:23  [ТС]     Обращение к методу объекта размещенного в динамической памяти #5
Огромное Спасибо всем кто откликнулся! Отдельное спасибо alsav22 за исследование кода моей программы.

В общем я понимал что проблема где-то в местах вот этих функций (просматривал их подробнее при поиске ошибки), но моих знаний видимо пока не хватает.

Продвинусь чуть дальше в изучении обязательно вернусь к своей программе. Но и уже сейчас, благодаря показанному исправленному коду я увидел несколько больше (вчера весь день пробовал менял код - вначале думал что проблема в обращениях к методам, но потом понял что проблема внутри классов скорее).

Невероятно Благодарен за это! Спасибо! Я обязательно вернусь к коду своей программы чуть позже (пройдя в обучении дальше).
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 17:57     Обращение к методу объекта размещенного в динамической памяти #6
Вот на эту тему обратите внимание (указатели в классе):
Цитата Сообщение от supra7sky Посмотреть сообщение
Если вы внутри класса используете динамическое выделение и освобождение памяти, то обязательно изучите конструкторы копий и проблемы, которые возникают при передаче объектов в функции, возврата из нее, присваивания.
Возврат - это то, что приводило к проблеме в вашем коде.
andrew_fg
 Аватар для andrew_fg
0 / 0 / 0
Регистрация: 29.03.2013
Сообщений: 6
30.03.2013, 18:32  [ТС]     Обращение к методу объекта размещенного в динамической памяти #7
Да! Спасибо! Я уже это понял что supra7sky указал на конкретную тему, а Вы разобрали пример подробнее именно по моему коду - сегодня ответ получил исчерпывающий. Очень доволен!

Просто сам я, обучаясь, стараюсь экспериментировать - почерпнул идею попробовать класс в классе, а затем решил попробовать разместить их объекты в динамической памяти причем даже размещая объекты из самого класса. Казалось все выйдет, но на самом деле забежал немного вперед. Просто не достаточно тонко еще понимаю внутренний механизм работы классов.

Из Вашего ответа я понял что происходит, но вижу что пока вот именно такой код немного не совсем понятен - налицо недостаток знаний. Что-ж для этого и экспериментирую, чтобы ставить вопросы и решать их.

Спасибо, я теперь понимаю на какую область в этом вопросе должен обратить внимание.
supra7sky
 Аватар для supra7sky
15 / 15 / 1
Регистрация: 07.02.2013
Сообщений: 123
30.03.2013, 18:44     Обращение к методу объекта размещенного в динамической памяти #8
Поищите книжку
Герберт Шилдт Самоучитель С++ (3 издание)
Вот например http://rutracker.org/forum/viewtopic.php?t=1281343

Иначе язык никак не выучить.
Эксперименты интересней делать, когда знаешь все детали механизма языка. В книжке много такого можно увидеть.
Сам читал ее страниц по 50-70 за сутки
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 23:09     Обращение к методу объекта размещенного в динамической памяти
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
andrew_fg
 Аватар для andrew_fg
0 / 0 / 0
Регистрация: 29.03.2013
Сообщений: 6
30.03.2013, 23:09  [ТС]     Обращение к методу объекта размещенного в динамической памяти #9
supra7sky, Благодарю! Я понимаю. Да эта книжка хорошая (знаю) есть у меня уже, но все равно Спасибо!

Вобщем-то я, кончно же, не без книжки эксперементирую. Отчего-то пока избрал для себя самоучитель "Освой самостоятельно C++ за 21 день" Джесса Либерти. Сроки не ставлю, но иду по ней по порядку (ничего не пропуская), порою возвращаясь к материалу через несколько дней (чтобы освежать знания) прежде чем идти дальше.

Идею своих экспериментов беру пока из этой книги, но часто стараюсь творчески усложнить задачи. Бывает увлекусь и забегаю вперед, как вчера.

По книжке Шилдта, думаю тоже пройду, но только уже после того как закончу с этой (чтобы не кидаться из стороны в сторону) - часто помогает больше узнать когда обращаешься к нескольким авторам (нет нет да расскажут какие-нибудь свои профессиональные тайны) - я понимаю основы языка нужно изучить очень хорошо, тогда и более сложные темы будут по плечу.

Спасибо за участие!

Добавлено через 3 часа 29 минут
Удивительно! Оказывается я всего то страниц 70 по своей книжке не дошел до этих конструкторов-копировщиков, но честно скажу если бы не запарился вчера со своей программкой и не ваши ответы сегодня, ребята, я бы тупил с ними по полной (мне кажется), а так я уже понимаю о чем речь и для чего.

В книжке для тренировок дается программка в которой конструктор, конструктор-копировщик и деструктор выводят на экран сообщение (о местонахождении) - наглядно показывается когда и что вызывается при передаче объекта функции или при возврате значения объекта.

Теперь я уже понимаю почему в совершенно одинаковом коде у меня одна строчка отрабатывала все таки, а остальные уже начинали чудить (это меня больше всего удивляло).

Вобщем, не даром я отнял у вас сегодня немного драгоценного времени - на пользу это.
Yandex
Объявления
30.03.2013, 23:09     Обращение к методу объекта размещенного в динамической памяти
Ответ Создать тему
Опции темы

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