Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 16.01.2019
Сообщений: 42

Ошибка обращения к удалённой функции?

19.12.2019, 23:45. Показов 1805. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, пишу класс кулькулятор с помощью стека. И выходит вот такая непонятная ошибка, пишет, что пытаюсь обратиться к удалённой функции. Скажите пожалуйста, что значит к удалённой функции? А то даже отладчик не успевает запускаться, как программа сразу завершается с ошибкой, т.е. я даже не могу посмотреть что там происходит по сути.

вот файл "tstack.h"

C++ (Qt)
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
#ifndef _TSTACK_
#define _TSTACK_
template <class T>
class TStack {
    T* arr;
    int size;
    int num;
public:
    TStack(int _size) {         //конструктор
        if (_size <= 0) throw _size;
        size = _size;
        arr = new T[size];
        num = -1;
    }
    ~TStack() {                      //деструктор  
        delete[] arr;
    }
    TStack(const TStack &St) {       //конструктор копирования
        size = St.size;
        arr = new T[size];
        num = St.num;
        for (int i = 0; i <= num; i++)
            arr[i] = St.arr[i];
    }
    void Push(T el) {                //Положить в стек
        if (num == size - 1) throw num;
        arr[num + 1] = el;
        num++;
    }
    T Pop() {                        //Взять из стека
        if (num == -1) throw num;
        num--;
        return arr[num + 1];
    }
    T Top() {                        //Посмотреть что на вершине стека
        if (num == -1) throw num;
        return arr[num];
    }
    bool IsEmpty() const {           //Проверить на пустоту
        if (num == -1)
            return true;
        return false;
    }
    bool IsFull() const {            //Проверить на полность
        if (num == size - 1)
            return true;
        return false;
    }
    void Clear() {                   //Очистить стек
        num = -1;
    }
};
#endif // !_TSTACK_
Вот файл "tcalculator.h"
C++ (Qt)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#ifndef _TCALCULATOR_H_
#define _TCALCULATOR_H_
 
#include "tstack.h"
#include <cmath>
#include <string>
 
using namespace std;
 
 
template <class T>
class TCalculator{
    string expr;
    string postfix;
    TStack <char> st_c;
    TStack <double> st_d;
public: void SetExpr(string s) {
        expr = s;
    }
    string GetExpr() {
        return expr;
    }
    int prior(char c) {              //Приоритеты операций
        if (c == 'c')
            return 0;
        if ((c == '+') || (c == '-'))
            return 1;
        if ((c == '*') || (c == '/'))
            return 2;
        if (c == '^')
            return 4;
    }
    void ToPostfix() {               //Метод перевода из инфиксной записи в постфиксную
        string str = "("; //временная строка
        str += expr;
        str += ")";
        st_c.Clear(); //опустошаем стек
        postfix = ""; //Присвоить постфиксу пустую строку, чтобы не было остатков от прошлых вычислений
        for (int i = 0; i < str.size(); i++) {
            if (str[i] == '(')
                st_c.Push(str[i]);
            if ((str[i] >= '0') && (str[i] <= '9') || (str[i] == '.'))
                postfix += str[i];
            if (str[i] == ')') {
                char tmp = st_c.Pop();
                while (tmp != '(') {
                    postfix += tmp;
                    tmp = st_c.Pop();
                }
            }
            if ((str[i] == '+') || (str[i] == '-') || (str[i] == '*') || (str[i] == '/') || (str[i] == '^')) {
                postfix += " "; //Пробел
                char tmp = st_c.Pop();
                while (prior(str[i]) <= prior(tmp)) {
                    postfix += tmp;
                    tmp = st_c.Pop();
                }
                st_c.Push(tmp);
                st_c.Push(str[i]);
            }
        }
    }
    double calc() {
        st_c.Clear();
        char* tmp;
        double res;
        for (int i = 0; i < postfix.length(); i++) {
            if (postfix[i] >= '0' && postfix[i] <= '9') {
                double d = strtod(&postfix[i], &tmp);
                int j = tmp - &postfix[i];
                i += j - 1;
                st_d.Push(d);
            }
            if ((postfix[i] == '*') || (postfix[i] == '/') || (postfix[i] == '+') || (postfix[i] == '-') || (postfix[i] == '^')) {
                double op1, op2;
                op2 = st_d.Pop();
                op1 = st_d.Pop();
                if (postfix[i] == '+')
                    res = op1 + op2;
                if (postfix[i] == '-')
                    res = op1 - op2;
                if (postfix[i] == '*')
                    res = op1 * op2;
                if (postfix[i] == '/')
                    res = op1 / op2;
                if (postfix[i] == '^')
                    res = pow(op1, op2);
            }
            st_d.Push(res);
        }
        if (st_d.IsEmpty())
            throw - 1;
        else
            res = st_d.Pop();
        return res;
    }
};
#endif // !_TCALCULATOR_H_
вот файл "main.cpp", где выдаёт ошибку

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include "tstack.h"
#include <iostream>
#include "tcalculator.h"
 
using namespace std;
 
int main() {
    /*int s = 10;
    TStack<int> St(20);
    if (!St.IsFull())
        St.Push(s);
    int a = St.Pop();
    cout << a;*/
    TCalculator<double> A; //вот здесь ошибка Error C2280 'TCalculator<double>::TCalculator(void)': 
        //attempting to reference a 
        //deleted function
        string expr;
    cin >> expr;
    cout << A.calc();
 
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2019, 23:45
Ответы с готовыми решениями:

Передача объектов функции. Два обращения к функции деструктора
В книге этот код должен 2 раза обращаться к функции деструктора, то есть результатом программы должно быть: Создание 10 Разрушение ...

Ошибка обращения к памяти
Здравствуйте. Перевожу алгоритм из Matlab в Delphi. Сначала использовал обычные массивы, чтобы отладить программу. Алгоритм работает...

Односвязные списки (функции обращения списка)
1. Написать рекурсивную функцию обращения списка. 2. Написать итеративную функцию обращения списка. :С попытался написать, так и не...

9
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
19.12.2019, 23:47
В TCalculator нет конструктора по-умолчанию.
1
0 / 0 / 0
Регистрация: 16.01.2019
Сообщений: 42
19.12.2019, 23:51  [ТС]
Croessmah, Я об этом думал, но не пойму как его делать. Тут же получается, что используется уже в нём конструктор стека. А что должен делать именно конструктор по умолчанию в калькуляторе?
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
20.12.2019, 02:30
Конструктора по умолчанию(без параметров) нет в классе TStack, а уже в TCalculator безуспешно пытаются создаться TStack объекты.
В TCalculator ничего из конструкторов нет, так что там работает дефолтный.
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
20.12.2019, 08:10
Цитата Сообщение от nalbe666 Посмотреть сообщение
так что там работает дефолтный.
Нет, дефолтный там как раз удален из-за отсутствия такового в TStack.
1
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
20.12.2019, 09:57
Croessmah, ну да, но причина ошибки не в том, что нету конструктора в TCalculator, такого чтобы создать объекты TStack, а в том, как эти объекты объявлены. Если сделать так:
C++
1
2
3
4
5
template <class T>
class TCalculator {
    TStack <char> st_c{ 42 };
    TStack <double> st_d{ 42 };
...
или
C++
1
2
3
4
5
template <class T>
class TStack {
...
public:
    TStack() = default;
или сделать, как говорит ошибка
C++
1
2
3
4
5
6
7
8
template <class T>
class TCalculator {
...
public:
    TCalculator() :
        st_c(42), st_d(42)
    {}
...
результат будет один, всё заработает.
1
0 / 0 / 0
Регистрация: 16.01.2019
Сообщений: 42
21.12.2019, 22:15  [ТС]
nalbe666, Croessmah, спасибо за подсказки. Проблему решил добавлением в конструкторе стека инициализации, вот так:

C++ (Qt)
1
2
3
4
5
6
TStack(int _size = 10) {         
        if (_size <= 0) throw _size;
        size = _size;
        arr = new T[size];
        num = -1;
    }
И всё заработало нормально
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
21.12.2019, 22:36
Цитата Сообщение от nalbe666 Посмотреть сообщение
но причина ошибки не в том, что нету конструктора в TCalculator
Как раз в этом причина вышеуказанной ошибки:
Цитата Сообщение от e7min Посмотреть сообщение
Error C2280 'TCalculator<double>::TCalculator(void)' : attempting to reference a deleted function
А вот то, что конструктор по-умолчанию в TCalculator в данном случае определен как удаленный, является следствием отсутствия конструктора по-умолчанию в подобъектах типа TStack.
Подробнее о случаях, когда конструктор объявляется как удаленный можно почитать в спецификации.

Добавлено через 1 минуту
Цитата Сообщение от e7min Посмотреть сообщение
TStack(int _size = 10)
Теперь этот конструктор является конструктором по-умолчанию.
В TCalculator без проблем неявно сгенерируется конструктор по-умолчанию.
1
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
21.12.2019, 23:00
Croessmah, Почему вы эту проблему разбираете с конца? Да, компилятор зачехнулся на втором классе, т.к. не может конструктором по-умолчанию построить объекты внутри этого класса. И всё, что вы написали - верно. Только может стоит посмотреть, почему вообще так получилось? Например, если в первом классе отсутствует конструктор без параметров, так может это плохая идея, пытаться создать где-то объект этого класса через отсутствующий конструктор?
Имхо, то, что вы называете причиной - как раз следствие.
1
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
21.12.2019, 23:09
nalbe666, Вы же сами указали способы решения проблемы без исправления первого класса. Странно было бы, если бы исправив следствие решилась проблема. Проблема-то как раз в TCalculator - это он использует TStack неправильно. Решения ровно два - либо исправить TStack под TCalculator, либо правильно использовать TStack в TCalculator. Источник ошибки именно в TCalculator.
Предлагаю не разводить бесполезный спор, а заказать выпивки за Ва счет.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.12.2019, 23:09
Помогаю со студенческими работами здесь

Ошибка обращения к нулевому адресу
int main(int argc, char* argv) { ifstream f (&quot;alphacntr&quot;,ios::in|ios::binary); if (!f) { cout&lt;&lt;&quot;File opening...

1С: Ошибка обращения к серверу 1С:предприятия
Добрый день! При переводе 1С предприятия с редакции 2.0 на 3.0 возникает ошибка: Ошибка обращения к серверу 1С:Предприятия по...

Ошибка обращения к элементу массива
void sort(int *mas, int len) { int max = mas; int min = mas; for (int i = 1; i&lt;len; ++i) { if (max &lt; mas) max = mas;...

Ошибка в уровнях косвенного обращения
Доброе всем время суток! Пишу программку, все делю по частям и проверяю. возникла ошибка, а именно : t: &quot;double&quot; отличается...

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


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

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