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

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

Войти
Регистрация
Восстановить пароль
 
 
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
#1

Задача из книги "C++ за 21 день" - C++

06.09.2012, 15:18. Просмотров 705. Ответов 18
Метки нет (Все метки)

Застопорился на этой задаче.
Задание: что неправильно в этой программе?
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
#include <iostream>
using namespace std;
class CAT
{
public:
       CAT(int age){itsAge=age;}
       ~CAT(){}
       int GetAge()const{return itsAge;}
private:
        int itsAge;      
};
CAT &MakeCat(int age)
{
CAT *pCat=new CAT(age);
return *pCat;   
 
}
 
int main()
{
    int age=10;
    CAT Boots = MakeCat(age);
    cout<<"Boots is "<<Boots.GetAge()<<" years old!\n";
system ("pause");  
return 0;
}
Вообще не могу понять, что неправильно в ней и как это, что то исправить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 15:18
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача из книги "C++ за 21 день" (C++):

Создать класс "Книга" с полями "название книги", "количество страниц", "год издания" - C++
Создать класс Книга поля: название книги,количество страниц,год издания методы: вычислить сколько лет книге и количество дней прошедших...

Heap Corruption Detected в листинге 19.6 из книги "Освой с++ за 21 день" - C++
MS Visual Studio 2010 Если заполнять элементы i,, - проблемы нет, если i,,, - heap corruption detected after normal block (#130),at...

Написать программу которaя запрашиваeт у пользователя номер дня недели, затем выводит одно из сообщений "рабочий день", "суббота", "воскресенье" - C++
Добрый день необходимо написать несколько программ, кто может помогите. одна тема - одна задача!

Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: "Рабочий день","Суббота" или "Воскресенье" - C++
Написать программу, которая запрашивает у пользователя номер дня недели и выводит одно из сообщений: &quot;Рабочий день&quot;,&quot;Суббота&quot; или...

Задача из книги "Програмирование - принципы и практика использования C++" - C++
Кто читал ету книгу, помогите разобратся с задачей с 12 главы. Никак не могу скомпилировать простую программу. Вот ее код: #include...

Создать класс Account. Задача из книги Дейтелов "Как програмировать на С++" - C++
Начал изучение С++, прочитал главу &quot;Введение в классы и объекты&quot; в книге Дейтелов &quot;Как програмировать на С++&quot;, ничего не поняв прочитал её...

18
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
06.09.2012, 15:21 #2
Aesonet, Память не очищается.
C++
1
CAT Boots = MakeCat(age);
Создаем копию из вернувшегося - уничтожаем вернувшееся. Все, у нас больше нету адреса, где была выделена память.

Можно исправить так.

C++
1
CAT& Boots = MakeCat(age);
И потом перед концом программы

C++
1
delete &Boots;
Но это тоже некорректно, т.к. когда мы удаляем объект - ссылка остается, в итоге ссылка ссылается на тот адрес, где был объект, то есть ссылка некорректная.

Проще всего и пожалуй логичнее, либо просто не делать указателей, т.е.
C++
1
2
3
4
CAT MakeCat(int age)
{
   return CAT(age);
}
или же возвращать указатель, а не ссылку
C++
1
2
3
4
5
CAT *MakeCat(int age)
{
CAT *pCat=new CAT(age);
return pCat;
}
1
Кот Ангенс
318 / 268 / 38
Регистрация: 24.05.2012
Сообщений: 629
06.09.2012, 15:25 #3
C++
1
2
3
CAT MakeCat(int age) { return CAT(age); }
CAT* AllocCat(int age) { return new CAT(age); }
void FreeCat(CAT* c) { delete c; }
Добавлено через 2 минуты
Опоздал.
1
CheshireCat
Эксперт С++
2895 / 1244 / 78
Регистрация: 27.05.2008
Сообщений: 3,397
06.09.2012, 15:38 #4
C++
1
CAT MakeCat(int age) {     return CAT(age);    }
1
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
06.09.2012, 15:52  [ТС] #5
C++
1
2
3
4
5
CAT *MakeCat(int age)
{
CAT *pCat=new CAT(age);
return pCat;
}
При таком возвращении, получается, что память выделенная в new CAT(age) удаляется автоматом по окончанию действия функции?

CheshireCat
Спасибо, просто я сейчас изучаю ссылки и указатели и в книги наверное имелось ввиду, как исправить программу с использованием динамической памяти. А не просто удалить ее.

З.Ы. Много непонятного в указателях для меня, так, что прошу сильно кирпичами не кидать....учусь, хоть иногда и кажется что это совсем не для меня и хочется кинуть изучение.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
06.09.2012, 16:05 #6
Aesonet,
При таком возвращении, получается, что память выделенная в new CAT(age) удаляется автоматом по окончанию действия функции?
Нет. Мы ее должны будем удалить сами. Или можем использовать std::shared_ptr и тогда не парится с удалением.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
06.09.2012, 16:07 #7
Цитата Сообщение от Aesonet Посмотреть сообщение
При таком возвращении, получается, что память выделенная в new CAT(age) удаляется автоматом по окончанию действия функции?
нет, память остается выделенной, и ее адрес присваивается указателю. и возвращается нечто. этот указатель до выхода из ф-ии содержит адрес объекта, а так как сам указатель находится в стеке, после выхода из ф-ии стэк может быть переписан другими значениями. в принципе, может быть и не переписан, но гарантии, что он все еще указывает туда куда нужно, никакой.
лень проверить. мне кажется, компилятор должен быть в состоянии такое отследить и запретить. а вообще использование ссылок - туфта. никогда не нравились такие высказывания:
C++
1
next() = previous();
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 16:11 #8
А еще он может оказаться и не в стеке вовсе=) Т.к. мы его никуда не возвращаем и никаких наружных действий с ним не происходит
0
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
06.09.2012, 16:14  [ТС] #9
C++
1
2
3
4
5
6
CAT *MakeCat(int age)
{
CAT *pCat=new CAT(age);
return pCat;
delete pCat;
}
Такое удаление считается корректным?

Блин совсем меня запутали, и так 3-й день не могу норм справиться с указателями и ссылками %)
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
06.09.2012, 16:16 #10
Aesonet, Конечно же. Есть только одна проблема, delete не вызовется ровным счетом никогда
1
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
06.09.2012, 16:16 #11
а ты возьми и попробуй...и в дебаггере посмотри)
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 16:17 #12
Остановись немного и оглянись назад=)
Есть 2 варианта: ты пытаешься удалить обьект pCat
1. До того как выйдешь из функции и вернешь обьект CAT
2. После того как выйдешь из функции=)
Оба варианта плохие. Лучше всего сделать так:
C++
1
2
3
4
CAT MakeCat(int age)
{
return CAT(age);
}
Большинство компиляторов в конечном коде отрежут копирование и лишнюю лабуду (может даже саму функцию)
1
ValeryS
Модератор
6709 / 5118 / 482
Регистрация: 14.02.2011
Сообщений: 17,213
06.09.2012, 16:19 #13
Цитата Сообщение от Aesonet Посмотреть сообщение
Такое удаление считается корректным?
ну если не считать того что дело до delete pCat; не дойдет
выход из функции на 4 строке
1
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
06.09.2012, 16:45  [ТС] #14
Получается самый корректный, простой и правильный вариант это:
C++
1
2
3
4
CAT MakeCat(int age)
{
return CAT(age);
}
?
И, что если в функции выделяется динамичная память на указатель, который потом будет возвращаться, то потом эту память нельзя будет корректно очистить?
0
PSIAlt
87 / 87 / 8
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 16:47 #15
В этом варианте с памятью все надежно.
1
06.09.2012, 16:47
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2012, 16:47
Привет! Вот еще темы с ответами:

Задача из книги Дейтела "Шахматная доска" - C++
В задаче использовать управляющие структуры(лог.операции, циклы) можно массивы. Остального я пока не знаю))

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

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

Даны три слова - "мама", "мыла", "раму". Задача - напечатать всевозможные варианты построения слов - C++
Я записал код, однако эту часть надо автоматизировать, поможете? КОД: } #include &lt;iostream&gt; using namespace std; int main()...


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

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

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