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

Объект класса в динамической памяти - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Перевести с Pascal на C++. Вычисление суммы (произведения) конечного ряда. http://www.cyberforum.ru/cpp-beginners/thread1224783.html
Программа вычисления суммы (произведения) конечного ряда. При разработке программы предусмотреть пропуск слагаемых (множителей), равных нулю или бесконечности. P/S Значение k ввести с клавиатуры var s, z, f: real; i, k: integer; begin s := 0; write('k=');
C++ Функция возведения в степень. написал библиотеку для вычисления степени чисел.некорректно работает при возвращении переменной из step.h в main.cpp и переводе в другую. step.h:#include <cmath> int result; int step(int choise, int step) { for(int i = 0; i < step; i++){ result *= choise; } http://www.cyberforum.ru/cpp-beginners/thread1224768.html
Двумерный массив, поиск локального минимума - доработать код C++
Написал следующий код, вроде запускается и работает только не всегда корректно считает. Задача в следующем найти локальные минимумы ( если элемент строго меньше его соседей ). Здесь еще надо учесть тот момент что элемент может стоять на границе и можно выйти за пределы массива но я это учел. #include <iostream> #include <ctime> #include <conio.h> using namespace std; bool check_border...
C++ Программа следящая за футбольной игрой
ребят,спасайте полный ***** препод дал задание на практику но как это обычно бывает в наших инстах нас особо программированию вообще никто не учил) ну так впринципе и есть) в общем задание такое 4 пункта: 1. Выделение у кадра области относящейся к полю 2. Есть ли на экране поле 3. Выделить ворота Выделить вратарскую линию и центральную линию Определить есть ли в области игрок заданой...
C++ Запись бинарного файла - На консоль выводиться дважды последнее прочтенное значение http://www.cyberforum.ru/cpp-beginners/thread1224717.html
Ошибка: на консоль выводиться дважды последнее прочтенное значение (в данном случае - 20). Подскажите, пожалуйста, как избежать данную проблему? #include <iostream> #include <fstream> #include <stdlib.h> using namespace std; int main() { ofstream myFile1("file.bin", ios::binary); if(!myFile1)
C++ Неправильно работает небольшая программа-калькулятор это калькулятор фунтов, шиллингов и пенсов по старой системе. он должен уметь складывать, вычитать суммы, а также, умножать на число. складывает, вычитает, а умножать отказывается. помогите! ан нет, наисправляла, теперь вообще не считает #include "stdafx.h" #include <iostream> using namespace std; int main() { int funt, funt1, shill, shill1, pens, pens1, funt2, shill2, pens2; char ch,... подробнее

Показать сообщение отдельно
lest_
0 / 0 / 0
Регистрация: 28.11.2013
Сообщений: 94
09.07.2014, 09:36     Объект класса в динамической памяти
Привет. Вот листинг:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
using namespace std;
 
class SimpleCat
{
public:
    SimpleCat(int age, int weight)
    {
        cout << "SimpleCat Constructor..." << endl;
        itsAge = age;
        itsWeight = weight;
    }
    ~SimpleCat() { cout << "In the DESTRUCTOR" << endl; }
    int GetAge()    { return itsAge; }
    int GetWeight() { return itsWeight; }
private:
    int itsAge;
    int itsWeight;
};
 
SimpleCat& func()
{
    SimpleCat* pFrisky = new SimpleCat(5,9);
    cout << "pFrisky: " << pFrisky << endl;
    return *pFrisky;
}
 
int main()
{
    SimpleCat& rCat = func();
    int age = rCat.GetAge();
    cout << "rCat is " << age << " years old!" << endl;
    cout << "&rCat: " << &rCat << endl;
 
    // Как бы избавиться от этой памяти?
    SimpleCat* pCat = &rCat;
    delete pCat; 
    pCat = 0;
    // Ой-ой, на что же теперь ссылается rCat?
 
    cout << &rCat << endl; // выводит тот же самый адрес
    cout << rCat.GetAge() << endl; // в Visual Studio 2010 выводит число -17891602
                                   // cpp.sh выводит 0 
 
    char response; std::cin >> response; // для задержки экрана
                            
    return 0;     
}
В функции main() необходимо освободить ненужный больше участок в динамической памяти. Для этого создаём указатель, инициализируем его адресом области в динамической памяти, а затем применяем к нему оператор delete (строки 36-38). После этого не понятно, на что ссылается rCat. Строчки 41 и 42 я сам добавил. В листинге в учебнике их не было. 2 разных компилятора выводят различный возраст удалённого кота (это надо воспринимать как "мусор"?). Автор говорит, что программа некоректная. И предлагает так решить проблему: "объявить объект класса SimpleCat в области динамической памяти (в теле функции func() ), но сделать это нужно так, чтобы функция func() вщзвращала указатель на данный объект. Затем, когда объект будет уже не нужен, его следует удалить в вызывающей функции при помощи оператора delete." Код не приведён. Я сам попробовал написать:
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
36
37
38
39
40
41
42
43
44
#include <iostream>
using namespace std;
 
class SimpleCat
{
public:
    SimpleCat(int age, int weight)
    {
        cout << "SimpleCat Constructor..." << endl;
        itsAge = age;
        itsWeight = weight; 
    }
    ~SimpleCat() { cout << "In the DESTRUCTOR" << endl; }
    int GetAge()    { return itsAge; }
    int GetWeight() { return itsWeight; }
private:
    int itsAge;
    int itsWeight;
};
 
SimpleCat* func()
{
    SimpleCat* pFrisky = new SimpleCat(5,9);
    cout << "pFrisky: " << pFrisky << endl;
    return pFrisky;
}
 
int main()
{
    SimpleCat* pCat = func();
    int age = pCat->GetAge(); // аналогично команде: int age = (*pCat).GetAge();
    
    cout << "pCat is " << age << " years old!" << endl;
    cout << "pCat: " << pCat << endl;
 
    delete pCat; // освободили область динамической памяти 
    pCat = 0;
 
    cout << pCat << endl; // выводит на экран: 00000000
 
    char response; std::cin >> response; // для задержки экрана
                            
    return 0;     
}
Такой вариант правильный или нет? И почему первый вариант некорректный, если всё компилируется и запускается?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 04:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru