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

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

Войти
Регистрация
Восстановить пароль
 
andrew_fg
0 / 0 / 0
Регистрация: 29.03.2013
Сообщений: 6
#1

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

30.03.2013, 00:01. Просмотров 566. Ответов 8
Метки нет (Все метки)

Я начинающий C++ ученик, изучил базовые классы, указатели и дошел до темы размещения объектов в динамической памяти.

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

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

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

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

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

myRectangle->getUpperLeft().getX()

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

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

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

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

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

IDE VisualStudio 2010.

Поможите разобраться, кто может, Люди Добрые! Пожалуйста! Хотелось бы догнать эту тему.
Спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.03.2013, 00:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обращение к методу объекта размещенного в динамической памяти (C++):

Обращение к свойству класса в динамической памяти - C++
Здравствуйте! Возникла проблема с обращением к свойству класса, расположенному в динамической памяти. Пойду по порядку. Создаю вот...

Удаление объекта, созданного в динамической памяти - C++
Здравствуйте! Подскажите, пожалуйста, правильное решение такой проблемы (возможно, это и не проблема вовсе :) . Вот фрагмент кода: ...

Доступ к членам объекта в динамической памяти - C++
Необходимо показать на примерах с комментариями доступ к членам объекта в динамической памяти

Обращение к методу string - C++
Подскажите пожалуйста, как обратиться к методу string передаваемой по ссылке в функцию?

Обращение методу в объекте** - C++
struct SomeProvider { public: void (* someFunc)(); } void callSomeFuncInSomeProvider(SomeProvider **p_ptrProvider) { /** Как...

Как сделать доступным обращение к методу параметра, объявленного константной ссылкой? - C++
Ругается на строку, содержащую присваивание локальной переменной значения метода параметра, объявленного константной ссылкой. Метод...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
supra7sky
15 / 15 / 1
Регистрация: 07.02.2013
Сообщений: 123
30.03.2013, 00:35 #2
Если вы внутри класса используете динамическое выделение и освобождение памяти, то обязательно изучите конструкторы копий и проблемы, которые возникают при передаче объектов в функции, возврата из нее, присваивания.

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

Попробуйте убрать полностью деструкторы и если все будет работать, значит проблема в этом.
alsav22
5417 / 4813 / 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
5417 / 4813 / 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
0 / 0 / 0
Регистрация: 29.03.2013
Сообщений: 6
30.03.2013, 09:23  [ТС] #5
Огромное Спасибо всем кто откликнулся! Отдельное спасибо alsav22 за исследование кода моей программы.

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

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

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

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

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

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

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

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

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

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

Вобщем, не даром я отнял у вас сегодня немного драгоценного времени - на пользу это.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 23:09
Привет! Вот еще темы с ответами:

Передача объекта методу другого объекта другого класса - C++
Всем привет. Есть у меня класс test1, который имеет конструкторы только с параметрами. Другой класс test2 имеет конструктор, который...

Обращение к динамической структуре через массив указателей - C++
При попытке обратиться к элементу динамической структуры через связанный с ним элемент массива указателей выдаёт ошибку (со строчки 73): ...

Как обратиться к методу объекта? - C++
static classA **mas; static int l = 0; mas = new Guest*; ifstream f("gs.txt"); if (f) { while (!f.eof()) { f >> p >> name; ...

Как обращаться к методу динамически созданного объекта? - C++
Тоесть как правильно: string *str = new string(); *str->size(); // или str->size();


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

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

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