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

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

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

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

06.09.2012, 15:18. Просмотров 660. Ответов 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;
}
Вообще не могу понять, что неправильно в ней и как это, что то исправить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2012, 15:18     Задача из книги "C++ за 21 день"
Посмотрите здесь:

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

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

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

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

Задача "День пряника" - C++
В школах страны Байтландии прижился интересный обычай. Один раз в году, в «День пряника» девочки пекут (под руководством старших, конечно!)...

Подходит ли книга "Освой самостоятельно c++ за 21 день" для новичков? - C++
Здравствуйте! Я новичок в программирование. И желаю научиться C++ есть книга Джесс Либерти &quot;Освой самостоятельно c++ за 21 день&quot; ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.09.2012, 15:21     Задача из книги "C++ за 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;
}
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
06.09.2012, 15:25     Задача из книги "C++ за 21 день" #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 минуты
Опоздал.
CheshireCat
Эксперт С++
2892 / 1241 / 78
Регистрация: 27.05.2008
Сообщений: 3,353
06.09.2012, 15:38     Задача из книги "C++ за 21 день" #4
C++
1
CAT MakeCat(int age) {     return CAT(age);    }
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
06.09.2012, 15:52  [ТС]     Задача из книги "C++ за 21 день" #5
C++
1
2
3
4
5
CAT *MakeCat(int age)
{
CAT *pCat=new CAT(age);
return pCat;
}
При таком возвращении, получается, что память выделенная в new CAT(age) удаляется автоматом по окончанию действия функции?

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

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

Блин совсем меня запутали, и так 3-й день не могу норм справиться с указателями и ссылками %)
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.09.2012, 16:16     Задача из книги "C++ за 21 день" #10
Aesonet, Конечно же. Есть только одна проблема, delete не вызовется ровным счетом никогда
Dark2012
0 / 0 / 0
Регистрация: 03.12.2011
Сообщений: 43
06.09.2012, 16:16     Задача из книги "C++ за 21 день" #11
а ты возьми и попробуй...и в дебаггере посмотри)
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 16:17     Задача из книги "C++ за 21 день" #12
Остановись немного и оглянись назад=)
Есть 2 варианта: ты пытаешься удалить обьект pCat
1. До того как выйдешь из функции и вернешь обьект CAT
2. После того как выйдешь из функции=)
Оба варианта плохие. Лучше всего сделать так:
C++
1
2
3
4
CAT MakeCat(int age)
{
return CAT(age);
}
Большинство компиляторов в конечном коде отрежут копирование и лишнюю лабуду (может даже саму функцию)
ValeryS
Модератор
6542 / 5008 / 461
Регистрация: 14.02.2011
Сообщений: 16,653
06.09.2012, 16:19     Задача из книги "C++ за 21 день" #13
Цитата Сообщение от Aesonet Посмотреть сообщение
Такое удаление считается корректным?
ну если не считать того что дело до delete pCat; не дойдет
выход из функции на 4 строке
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
06.09.2012, 16:45  [ТС]     Задача из книги "C++ за 21 день" #14
Получается самый корректный, простой и правильный вариант это:
C++
1
2
3
4
CAT MakeCat(int age)
{
return CAT(age);
}
?
И, что если в функции выделяется динамичная память на указатель, который потом будет возвращаться, то потом эту память нельзя будет корректно очистить?
PSIAlt
86 / 86 / 8
Регистрация: 19.06.2012
Сообщений: 245
06.09.2012, 16:47     Задача из книги "C++ за 21 день" #15
В этом варианте с памятью все надежно.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
06.09.2012, 16:48     Задача из книги "C++ за 21 день" #16
Aesonet, Можно.
C++
1
2
3
4
CAT* MakeCat(int age)
{
return new CAT(age);
}
Абсолютно корректный код, если есть delete конечно.

C++
1
2
3
4
std::shared_ptr<CAT> MakeCat(int age)
{
   return std::make_shared<CAT>(age);
}
А вот тут даже без delete будет корректный код.
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
06.09.2012, 17:12  [ТС]     Задача из книги "C++ за 21 день" #17
Всем спасибо, вроде бы, более менее разобрался.

Если не трудно, напишите корректное удаление памяти по этому коду.
C++
1
2
3
4
CAT* MakeCat(int age)
{
return new CAT(age);
}
Кот Ангенс
317 / 267 / 38
Регистрация: 24.05.2012
Сообщений: 629
06.09.2012, 17:28     Задача из книги "C++ за 21 день" #18
Цитата Сообщение от Кот Ангенс Посмотреть сообщение
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; }
C++
1
2
3
4
5
int main() {
    CAT* Murka = AllocCat(10);
    cout << "Murka is " << Murka.GetAge() << " years old.";
    FreeCat(Murka);
}
Считаю, если память выделяется в функции, то она и освобождаться должна в функции (другой). Иначе как-то нерасиво.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2012, 17:44     Задача из книги "C++ за 21 день"
Еще ссылки по теме:

В классе "Date" увеличить заданную дату на один день - C++
Не могу понять в чем ошибка(выдает ошибку линковки). В классе Date нужно увеличить заданную дату на один день: #include&lt;iostream&gt; ...

Калькулятор из главы 6 книги Б.Страуструппа "Пинципы и практика с использованием C++" - C++
Доброго времени суток. Во главе 6 возникли проблемы с функционированием калькулятора. Я ввожу выражение(или лексему) и дальше ничего не...

Нужно рассчитать день, который будет "послезавтра", по заданной дате - C++
Нужно рассчитать день который будет послезавтра из заданной даты. Без использования &quot;всяческих кодов&quot;

Не работает программа из книги Дейтела "Как программировать на с++" - C++
Помогите, пожалуйста, решить проблему. Программа из раздела книги &quot;Отделение интерфейса от реализации&quot;. При компиляции(использую visual c++...


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

Или воспользуйтесь поиском по форуму:
Aesonet
23 / 23 / 1
Регистрация: 04.04.2012
Сообщений: 119
06.09.2012, 17:44  [ТС]     Задача из книги "C++ за 21 день" #19
C++
1
cout << "Murka is " << Murka.GetAge() << " years old.";
Вот так запахало.
C++
1
cout << "Murka is " << Murka->GetAge() << " years old.";
Yandex
Объявления
06.09.2012, 17:44     Задача из книги "C++ за 21 день"
Ответ Создать тему
Опции темы

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