Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506

Зачем нужны конструктор и деструктор класса?

27.09.2009, 01:13. Показов 3446. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
вот задание:
Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в динамической области памяти. Конструктор для их создания (операция new) и установки их начальных значений: Х (); деструктор: ~ Х (); friend – функция печати: friend void print(); функция, решающая поставленную задачу: friend Void Run(). Код методов и функций– вне пространства определения класса.

вот моя прога:
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
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <math.h>
#include "class.h"
 
class X
{
        double *x,*y,*z,res;
        friend void run();
        friend void print();
public:
    X(double=0, double=0, double=0);
    ~X();
};
 
X :: X(double x1, double y1, double z1)
    {//конструктор
        x=new double;
            x1=*x;
        y=new double;
            y1=*y;
        z=new double;
            z1=*z;
    }
 
void run(){
    res=(pow(y,x+1))/(pow(fabs(y-2),1.0/3)+3)+(x+y/2)/(2*fabs(x+y))*pow(x+1,(-1/sin(z)));
}
 
void print()
{
    std::cout<<"\nResult:"<<res;
}
 
X:: ~X() {};//деструктор
 
void main(void)
{
X(1.23,15.4,252.0);
run();
print();
getch();
}
я какбы толком не могу разобратся как работает конструктор и деструктор, и зачем они нужны, не моглибы на пальцах обьяснить?
и ещё компилятор выдаёт ошибку:
пишет что переменные res x y z undeclared identifier в строке
C++
1
res=(pow(y,x+1))/(pow(fabs(y-2),1.0/3)+3)+(x+y/2)/(2*fabs(x+y))*pow(x+1,(-1/sin(z)));
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.09.2009, 01:13
Ответы с готовыми решениями:

Конструктор и деструктор анонимного класса
Здравствуйте. Есть ли в С++ такая возможность? Очень нужна именно такая реализация класса, но если это невозможно, буду думать.

Конструктор (деструктор) у класса, не имеющего тип
Можно ли объявить и определить конструктор у класса, который не имеет тип? То есть у меня в программе всего 1 экземпляр этого класса,...

Для класса задать конструктор и деструктор
Ребята,нужна помощь в написании программы. Для класса задать конструктор(для выделения памяти,открытия файлов,задания начальных значений...

8
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
27.09.2009, 01:41
Ошибка "undeclared identifier" значит, что компилятор, по-русски говоря, не понимает, что это за переменные res, x, y да ещё и z
Неопознанные идентификаторы- вот как это переводится.
А оно на самом деле так.

Ибо хоть ты их объявил в классе, но они по умолчанию видимы ТОЛЬКО в пределах класса или при помощи специальных функций-членов (или методов) этого класса или так называемых дружественных функций (типа они дружат с классом и видят его всего.)

А ты просто решил к этим переменным обратиться, так не пойдёт.
...Вообще книжки читать надо. Там иногда полезные вещи пишут.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
27.09.2009, 02:14
вот так скомпилировалось:
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
49
50
51
52
53
54
55
56
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
#include <cmath>
 
class X {
private:
    double *x;
    double *y;
    double *z;
public:
    X(double x1, double y1, double z1);
    ~X();
    friend void printX(X obj);
    friend void runX(X obj);
};
 
X::X(double x1=0, double y1=0, double z1=0){
    x = new double(x1);
    y = new double(y1);
    z = new double(z1);
}
 
X::~X(){
    delete x;
    delete y;
    delete z;
}
 
void printX(X obj){
    cout << *(obj.x) << '\t' << *(obj.y) << '\t' << *(obj.z) << endl;
}
 
void runX(X obj){
    double x,y,z,res;
    x = *(obj.x);
    y = *(obj.y);
    z = *(obj.z);
    res=(pow(y,x+1.0))/(pow(fabs(y-2.0),1.0/3.0+3.0))+(x+y/2.0)/(2.0*fabs(x+y))*pow(x+1.0,(-1.0/sin(z)));
    cout << res << endl;
}
 
 
int main( void ){
    double a, b, c;
    cout << "Enter three double values for X: ";
    cin >> a >> b >> c;
    X o(a,b,c);
    cout << "Print X values:" << endl;
    printX(o);
    cout << "Calculate X values:" << endl;
    runX(o);
    return 0;
}
но вылетает на функции. Там изначально какой-то блудняк со скобками был. Как смог, переделал, но видимо неправильно. Мелкомягкий дебагер говорит, что
Code
1
Unhandled exception at 0x7c9109f9 in class_x.exe: 0xC0000005: Access violation reading location 0x00080181.
а скомпилённая gcc в cygwin вот так
Code
1
2
3
4
5
6
7
8
9
$ ./class_x.exe
Enter three double values for X: 44.4 -2.5 11.1
Print X values:
44.4    -2.5    11.1
Calculate X values:
inf
      5 [sig] class_x 3436 _cygtls::handle_exceptions: Error while dumping state
 (probably corrupted stack)
Segmentation fault (core dumped)
ругается...
При чём в cmd консоли что-то сосчиталось всё-таки
Code
1
2
3
4
5
Enter three double values for X: 2.2 1.21 22.1
Print X values:
2.2     1.21    22.1
Calculate X values:
18388.1
0
146 / 129 / 6
Регистрация: 29.07.2008
Сообщений: 506
27.09.2009, 15:06  [ТС]
kravam, на сколько я понимаю что я написал в проге я и пытаюсь обратится к этим переменным через friend функцию.
easybudda с выражением проблем не должно быть тк в предыдущей лабе оно работало.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
27.09.2009, 15:22
YAUHEN, Да она у меня и без "выражения" вылетает. Кстати, самому интересно, с какого перепуга...
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
27.09.2009, 15:59
YAUHEN, прошу прощенья, не заметил.
0
Эксперт С++
1675 / 1047 / 174
Регистрация: 27.09.2009
Сообщений: 1,945
27.09.2009, 20:36
Всё дело в передаче аргумента. Напиши в функциях не (X obj), а (X &obj), а ещё лучше (const X &obj).
Если интересна суть происходящего, то дело вот в чём - при передаче объекта в функцию срабатывает конструктор копирования. Поскольку он не объявлен явно, срабатывает созданная компилятором версия, поэлементно копирующая члены в новый объект. В нашем случае - указатели. При выходе из функции срабатывает деструктор аргумента и выделенная память (на которую ссылается как объект параметра, так и породивший его объект, живущий в функции main) уничтожается, после чего указатели объекта, сидящего в функции main начинают указывать "в никуда". Дальнейшее обращение по данным указателям и вызывает исключительную ситуацию.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
27.09.2009, 21:26
Да,
так
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
49
50
51
52
53
54
55
56
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
 
#include <cmath>
 
class X {
private:
    double *x;
    double *y;
    double *z;
public:
    X(double x1, double y1, double z1);
    ~X();
    friend void printX(const X &obj);
    friend void runX(const X &obj);
};
 
X::X(double x1=0, double y1=0, double z1=0){
    x = new double(x1);
    y = new double(y1);
    z = new double(z1);
}
 
X::~X(){
    delete x;
    delete y;
    delete z;
}
 
void printX(const X &obj){
    cout << *(obj.x) << '\t' << *(obj.y) << '\t' << *(obj.z) << endl;
}
 
void runX(const X &obj){
    double x,y,z,res;
    x = *(obj.x);
    y = *(obj.y);
    z = *(obj.z);
    res=(pow(y,x+1))/(pow(fabs(y-2),1.0/3)+3)+(x+y/2)/(2*fabs(x+y))*pow(x+1,(-1/sin(z))); // original
    cout << res << endl;
}
 
 
int main( void ){
    double a, b, c;
    cout << "Enter three double values for X: ";
    cin >> a >> b >> c;
    X o(a,b,c);
    cout << "Print X values:" << endl;
    printX(o);
    cout << "Calculate X values:" << endl;
    runX(o);
    return 0;
}
работает. При чём с оригинальной версией функции.
0
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,705
01.03.2013, 13:34
Цитата Сообщение от Nick Alte Посмотреть сообщение
При выходе из функции срабатывает деструктор аргумента и выделенная память (на которую ссылается как объект параметра, так и породивший его объект, живущий в функции main) уничтожается, после чего указатели объекта, сидящего в функции main начинают указывать "в никуда"
То есть я правильно понял- имеем объект ob с полями указателями, например (x,y,z) указывающими на определённую область памяти. Потом копируем этот объект, (не нарочно, а косвенно, вот так: (run (ob)), чего-то там делаем- проще говоря, делаем вычисления с разыменоваными указателями, а при возвращении из run указатели в x будут невалидны?

Да нет конечно. Замечу также, что деструктор, сработающий при выходе из run никакого влияния на память, на которую указывают указатели (я про x, y и z) не окажет- ибо его нет, этого деструктора.

А если мы его напишем:
C++
1
X:: ~X() {;delete x; delete y; delete z;};
Тогда да, по выходе из run(ob) указатели невалидны (что не значит, что вылетит исключение, у меня по ним мусор просто появляется.)

Тем не менее, конечно, правильно писать
C++
1
run (X& ob);
. Но это единственное на что будет влиять- на правильность данных, которые мы впоследствие будем выводит print. Но, повторюсь, в противном случае (а именно: run (X ob)) по выходе из run указатели в оригинальном объекте (а не в той копии, котрая была передана в run, как мы выяснили, она к этом времени исчезнет) всё равно останутся валидными.

++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++

Цитата Сообщение от easybudda Посмотреть сообщение
но вылетает на функции
на какой? У меня вот не вылетает нигде. Мусор есть, а вылетать не вылетает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
01.03.2013, 13:34
Помогаю со студенческими работами здесь

Дописать конструктор и деструктор для класса
Помогите пожалуйста написать конструктор копии и деструктор, а также вызвать их, чтобы деструктор выводил на экран &quot;работает&quot; ...

Создание класса с перегрузкой операторов конструктор и деструктор
Создать класс времени (Time) содержащий закрытую переменную-член хранящую целое значение времени интервала в секундах. Интерфейс класса...

Можно ли Конструктор и Деструктор вызывать как метод класса?
Собственно вопрос: можно ли Конструктор и Деструктор вызывать вручную, как обычный метод класса? Например, я хочу управлять...

Нужно ли прописывать конструктор и деструктор для чисто виртуального абстрактного класса
Всем привет! Порылся в интернете, но не смог найти конкретного ответа на свой вопрос. Возможно я просто не смог грамотно сформулировать...

Определить конструктор без параметров, конструктор с одним параметром, конструктор с двумя параметрами, деструктор
Создать класс «матрица». Данный класс должен содержать элементы типа int, определяющие число строк, столбцов и состояние ошибки. Определить...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru