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

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

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

Что не правильно в этой программе? - C++

27.07.2009, 23:48. Просмотров 968. Ответов 12
Метки нет (Все метки)

Здравствуйте все!
Познаний в с++ мало, чтаю, пробую учить.
В одной из книг упражнение - найти что не так, подскажите.
Спасибо всем заранее.
Текст ниже.
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
#include <iostream>
using namespace std;
 
class CAT
{
public:
    CAT(int x){itsAge =x;}
    ~CAT(){}
    int GetAge() const {return itsAge;}
private:
    int itsAge;
};
 
CAT &MakeCat(int ageage);
int main() {
    int age=7;
    CAT Boots = MakeCat(age);
    cout<< "Boots is:" << Boots.GetAge()<<"years"<<endl;
    return 0;
}
CAT &MakeCat(int ageage)
{
    CAT *pCat = new CAT (ageage);
    return *pCat;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2009, 23:48     Что не правильно в этой программе?
Посмотрите здесь:

Объясните все действия, происходящие в этой программе. C++
C++ Объясните все действия, происходящие в этой программе.
Как исправить ошибки C2065, C2109 в этой программе? C++
C++ почему в этой программе мы каждый раз perem=_BX?
нужно написать все циклы происходящие в этой программе C++
в этой программе нужно убратьб цикл C++
C++ какой можно к этой программе написать деструктор
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
sёgun
 Аватар для sёgun
2 / 2 / 0
Регистрация: 25.07.2009
Сообщений: 5
27.07.2009, 23:56     Что не правильно в этой программе? #2
Память, выделенная под объект класса CAT не освобождается.
А что за странная функция MakeCat()? Почему бы просто не вызывать конструктор класса?
sledge
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 13
28.07.2009, 01:10  [ТС]     Что не правильно в этой программе? #3
Цитата Сообщение от sёgun Посмотреть сообщение
Память, выделенная под объект класса CAT не освобождается.
Подскажите, пожалуйста, как исправить?

Цитата Сообщение от sёgun Посмотреть сообщение
А что за странная функция MakeCat()? Почему бы просто не вызывать конструктор класса?
Почему функция, а не конструктор? Может быть потому, что можно изменить тип возвращаемого значение, аргументы - это тестове задание.

Спасибо.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1344 / 877 / 51
Регистрация: 02.01.2009
Сообщений: 2,642
Записей в блоге: 1
28.07.2009, 01:39     Что не правильно в этой программе? #4
так немного поправил.
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
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
class CAT
{
public:
    CAT(int x){itsAge =x;}
    ~CAT(){}
    int GetAge() const {return itsAge;}
private:
    int itsAge;
};
 
CAT *MakeCat(int ageage);
void ReleaseCat(CAT *rhs);
 
int main() {
    int age=7;
    CAT *Boots = MakeCat(age);
    cout<< "Boots is: " << Boots->GetAge()<<" years"<<endl;
    ReleaseCat(Boots);
    return 0;
}
CAT *MakeCat(int ageage)
{ 
    std::cout << "create\n";
    return new CAT (ageage);
}
 
void ReleaseCat(CAT *rhs){
    if(rhs){
        delete rhs;
        std::cout << "free\n";
    }
}
Search..
Заказ софта
 Аватар для Search..
339 / 184 / 10
Регистрация: 26.05.2009
Сообщений: 863
28.07.2009, 01:55     Что не правильно в этой программе? #5
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>
 
class CAT
{
    int itsAge;
public:
    CAT(int x): itsAge(x)
    { std::cout << "Cat C.\n"; }
    ~CAT()
    { std::cout << "Cat D.\n"; }
    int GetAge() const 
    { return itsAge; }
};
 
int main()
{
    int age = 7;
 
    CAT *pBoots = new CAT(age);
 
    std::cout << "Boots is: " << pBoots->GetAge() << " years." << "\n";
 
    delete pBoots;
 
    return 0;
}
sledge
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 13
28.07.2009, 14:25  [ТС]     Что не правильно в этой программе? #6
Цитата Сообщение от ISergey Посмотреть сообщение
так немного поправил.
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
27
28
29
30
31
#include <iostream>
using namespace std;
class CAT
{
public:
    CAT(int x){itsAge =x;}
    ~CAT(){}
    int GetAge() const {return itsAge;}
private:
    int itsAge;
};
CAT *MakeCat(int ageage);
void ReleaseCat(CAT *rhs);
int main() {
    int age=7;
    CAT *Boots = MakeCat(age);
    cout<< "Boots is: " << Boots->GetAge()<<" years"<<endl;
    ReleaseCat(Boots);
    return 0;
}
CAT *MakeCat(int ageage)
{ 
    std::cout << "create\n";
    return new CAT (ageage);
}
void ReleaseCat(CAT *rhs){
    if(rhs){
        delete rhs;
        std::cout << "free\n";
    }
}
Я вот тут решил тоже сделать через указатель
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
27
#include <iostream>
using namespace std;
class CAT
{
public:
        CAT(int x){itsAge =x;}
        ~CAT(){}
        int GetAge() const {return itsAge;}
private:
        int itsAge;
};
CAT * MakeCat(int ageage);
int main() {
        int age=7;
        CAT Boots (3);
        cout<< "Boots is:" << Boots.GetAge()<<"years"<<endl;
        CAT *pCAT = MakeCat(26);
        Boots = *pCAT;
        delete pCAT;
        pCAT=NULL;
        cout<< "Boots is:" << Boots.GetAge()<<"years"<<endl;
        return 0;
}
CAT * MakeCat(int ageage)
{       CAT *pCat = new CAT (ageage);
        return pCat;
}
Все ли правильно с т.з. управления памяТТю, нигде ничего не зависло, не заблудилось, не утекло?
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
28.07.2009, 20:08     Что не правильно в этой программе? #7
C++
1
delete pCat;
можно поместить перед return 0; в этом случае.
Monte-Cristo
 Аватар для Monte-Cristo
2807 / 1372 / 30
Регистрация: 07.03.2009
Сообщений: 4,446
28.07.2009, 20:27     Что не правильно в этой программе? #8
Цитата Сообщение от Sekt Посмотреть сообщение
можно поместить перед return 0;
не можно, а нужно так как память выделяется не в main(), а в отдельной функции. Поэтому наличии очистки обязательно.

Добавлено через 1 минуту 43 секунды
p.s: ой, а тут удаление есть
Skirmisher
44 / 44 / 0
Регистрация: 23.05.2009
Сообщений: 92
01.08.2009, 00:19     Что не правильно в этой программе? #9
Цитата Сообщение от Sekt Посмотреть сообщение
C++
1
delete pCat;
можно поместить перед return 0; в этом случае.
Если ты поставишь delete перед функцией, то память выделенная под объект(new)
тут же удалиться и смысл функции потерется, хотя в такой функции
C++
1
2
3
4
5
CAT *MakeCat(int ageage)
{ 
        std::cout << "create\n";
        return new CAT (ageage);
}
Неизбежна утечка памяти.
Для того чтобы это избежать надо пользоваться конструтором, который после использования объекта автоматически вызывает деструктор.
C++
1
Cat cat(4);
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 09:24     Что не правильно в этой программе? #10
Цитата Сообщение от Skirmisher Посмотреть сообщение
хотя в такой функции Неизбежна утечка памяти.
это в каком месте она неизбежна?
Цитата Сообщение от Skirmisher Посмотреть сообщение
Для того чтобы это избежать надо пользоваться конструтором, который при выходе из области видимости объекта автоматически вызывает деструктор.
или shared_ptr/auto_ptr.
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
01.08.2009, 20:05     Что не правильно в этой программе? #11
долго думал, но не смог понять, чем именно вот это:

CAT *pCAT = MakeCat(26);
...
CAT * MakeCat(int ageage)
{ CAT *pCat = new CAT (ageage);
return pCat;
}

лучше чем просто:

CAT *pCAT = new CAT (ageage);

?

или почему объект просто в стеке не создать:

CAT cat (ageage);

?

а то можно еще так:

CAT *pCAT = MakeCatCat(26);
...

CAT * MakeCatCat(int ageage)
{
return MakeCAT (ageage);
}
...
CAT * MakeCat(int ageage)
{ CAT *pCat = new CAT (ageage);
return pCat;
}

идею можно развить.
zim22
depict1
 Аватар для zim22
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 20:09     Что не правильно в этой программе? #12
Цитата Сообщение от novi4ok Посмотреть сообщение
долго думал, но не смог понять, чем именно вот это:
Цитата Сообщение от novi4ok Посмотреть сообщение
лучше чем просто:
разные уровни абстракции. чем ближе к предметной области - тем лучше.
***
что легче понять?
1 вариант:
C++
1
2
3
4
Human ivan;
ivan.wakeUp();
ivan.brushTeeth();
ivan.die(); // :)
2 вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
int ivanAge = 18;
char ivanName[255] = "ivan";
int ivanStatus = SLEEP;
 
if (ivanStatus == SLEEP) {
  ivanStatus = WAKEUP;
}
 
if (ivanStatus == WAKEUP && ivanAge >= 2) {
  ivanStatus = BRUSH_TEESH & WAKEUP;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2009, 00:04     Что не правильно в этой программе?
Еще ссылки по теме:

C++ Какую блок схему нужно нарисовать к этой программе?
Почему в этой программе (n+2) и [m+2] а не просто n и m? C++
Скажите пожалуйста используется ли в этой программе полиморфизм? C++
C++ Можно ли изменить значение памяти в этой программе?
Как в этой программе правильно вывести матрицу? а то она у меня "пляшет" C++

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

Или воспользуйтесь поиском по форуму:
novi4ok
549 / 502 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
02.08.2009, 00:04     Что не правильно в этой программе? #13
Цитата Сообщение от zim22 Посмотреть сообщение
разные уровни абстракции. чем ближе к предметной области - тем лучше.
***
что легче понять?
1 вариант:
C++
1
2
3
4
Human ivan;
ivan.wakeUp();
ivan.brushTeeth();
ivan.die(); // :)
2 вариант:
C++
1
2
3
4
5
6
7
8
9
10
11
int ivanAge = 18;
char ivanName[255] = "ivan";
int ivanStatus = SLEEP;
 
if (ivanStatus == SLEEP) {
  ivanStatus = WAKEUP;
}
 
if (ivanStatus == WAKEUP && ivanAge >= 2) {
  ivanStatus = BRUSH_TEESH & WAKEUP;
}
finite state mashine с тремя (четырьмя?) состояниями напрашивается. тогда еще проще все будет.
Yandex
Объявления
02.08.2009, 00:04     Что не правильно в этой программе?
Ответ Создать тему
Опции темы

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