Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 13
1

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

27.07.2009, 23:48. Просмотров 1070. Ответов 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;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.07.2009, 23:48
Ответы с готовыми решениями:

Что неправильного в этой простой программе?
#include &lt;iostream&gt; #include &lt;cstring&gt; #include &lt;windows.h&gt; using namespace std; int main()...

Что надо дописать в этой программе, чтобы получить правильный ответ?
У Васи сегодня день рождения, и он пригласил много друзей. Для них Вася выставил в ряд n бутылок с...

Как в этой программе правильно вывести матрицу? а то она у меня "пляшет"
Как в этой программе правильно вывести матрицу? а то она у меня &quot;пляшет&quot;. Задача: Дана матрица...

Почему в этой программе (n+2) и [m+2] а не просто n и m?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale.h&gt; using namespace std; void main() {...

12
2 / 2 / 0
Регистрация: 25.07.2009
Сообщений: 5
27.07.2009, 23:56 2
Память, выделенная под объект класса CAT не освобождается.
А что за странная функция MakeCat()? Почему бы просто не вызывать конструктор класса?
0
0 / 0 / 0
Регистрация: 27.07.2009
Сообщений: 13
28.07.2009, 01:10  [ТС] 3
Цитата Сообщение от sёgun Посмотреть сообщение
Память, выделенная под объект класса CAT не освобождается.
Подскажите, пожалуйста, как исправить?

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

Спасибо.
0
Maniac
Эксперт С++
1446 / 948 / 158
Регистрация: 02.01.2009
Сообщений: 2,813
Записей в блоге: 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";
    }
}
1
Заказ софта
342 / 187 / 21
Регистрация: 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;
}
0
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;
}
Все ли правильно с т.з. управления памяТТю, нигде ничего не зависло, не заблудилось, не утекло?
0
158 / 157 / 47
Регистрация: 29.04.2009
Сообщений: 637
28.07.2009, 20:08 7
C++
1
delete pCat;
можно поместить перед return 0; в этом случае.
0
2807 / 1398 / 107
Регистрация: 07.03.2009
Сообщений: 4,446
28.07.2009, 20:27 8
Цитата Сообщение от Sekt Посмотреть сообщение
можно поместить перед return 0;
не можно, а нужно так как память выделяется не в main(), а в отдельной функции. Поэтому наличии очистки обязательно.

Добавлено через 1 минуту 43 секунды
p.s: ой, а тут удаление есть
0
45 / 45 / 1
Регистрация: 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);
1
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
01.08.2009, 09:24 10
Цитата Сообщение от Skirmisher Посмотреть сообщение
хотя в такой функции Неизбежна утечка памяти.
это в каком месте она неизбежна?
Цитата Сообщение от Skirmisher Посмотреть сообщение
Для того чтобы это избежать надо пользоваться конструтором, который при выходе из области видимости объекта автоматически вызывает деструктор.
или shared_ptr/auto_ptr.
0
554 / 508 / 25
Регистрация: 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;
}

идею можно развить.
0
depict1
281 / 146 / 4
Регистрация: 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;
}
0
554 / 508 / 25
Регистрация: 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 с тремя (четырьмя?) состояниями напрашивается. тогда еще проще все будет.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.08.2009, 00:04

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

Все ли нормально в этой программе?
#include&lt;iostream&gt; #include&lt;conio.h&gt; using namespace std; int PriceInput() { int price;...

в этой программе нужно убратьб цикл
#include&lt;iostream&gt; using namespace std; int main() { int t=1, a, b; cin&gt;&gt;a&gt;&gt;b; ...

Можно ли изменить значение памяти в этой программе?
Есть такая программа (исходник): cut Суть такая как изменить значение в ней через программы типа...

Объясните все действия, происходящие в этой программе.
#include &lt;cstdlib&gt; #include &lt;iostream&gt; using namespace std; int main(int argc, char *argv)...


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

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

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