Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
1

Почему выскакивает ошибка In instantiation of 'void stack_t<T>::println() const [with T = int]': - строка 165?

24.02.2019, 08:49. Показов 1749. Ответов 49
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Ошибка:
In instantiation of 'void stack_t<T>:rintln() const [with T = int]': - строка 165
Почему она пропадает, если поставить const после print у stack_t<T>?

Кликните здесь для просмотра всего текста
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
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <iostream>
#include <stdexcept>
#include <vector>
 
using namespace std;
 
// Узел стека.
template<typename T>
class node_t
{
private:
    void init(T value, node_t<T>* ptr_next)
    {
        this->value = value;
        this->ptr_next = ptr_next;
    }
    
public:
    T value;
    node_t<T>* ptr_next;
    
    node_t()
    {
        init(0, NULL);
    }
    
    node_t(T value, node_t<T>* ptr_next)
    {
        init(value, ptr_next);
    }
    
    node_t(const node_t<T>& target)
    {
        init(target->value, target->ptr_next);
    }
    
    ~node_t()
    {
        delete this;
    }
    
    // Выводит данные узла.
    void print() const
    {
        cout << value;
    }
    
    // Выводит данные узла и переходит на новую строку.
    void println() const
    {
        print();
        cout << endl;
    }
};
 
// Стек.
template<typename T>
class stack_t
{
private:
    node_t<T>* ptr_head;
    int count;
 
    void init()
    {
        ptr_head = NULL;
        count = 0;
    }
    
    void throw_if_empty() const
    {
        if (count == 0)
            throw out_of_range("count был равен 0");
    }
 
public:
    // Возвращает количество элементов стека.
    int get_count() const
    {
        return count;
    }
    
    stack_t()
    {
        init();
    }
    
    stack_t(int count, T* array)
    {
        init();
        T* ptr_current = array;
        for (int i = 0; i < count; i++)
        {
            push(*ptr_current);
            ptr_current++;
        }
    }
    
    stack_t(vector<T>* vector)
    {
        init();
        for (int i = 0; i < vector->count(); i++)
            push(vector[i]);
    }
    
    ~stack_t()
    {
        delete ptr_head;
    }
    
    // Вставляет указанный элемент в стек.
    void push(T item)
    {
        ptr_head = new node_t<T>(item, ptr_head);
        count++;
    }
    
    // Возвращает верхний элемент стека.
    T pop()
    {
        throw_if_empty();   
        T resultItem = ptr_head->value;
        node_t<T>* ptr_to_remove = ptr_head;
        ptr_head = ptr_head->next_ptr;
        delete ptr_to_remove;
        count--;
        return resultItem;
    }
    
    // Возвращает верхний элемент стека.
    T peek()
    {
        throw_if_empty();
        return ptr_head->value;
    }
    
    // Очищает стек.
    void clear()
    {
        node_t<T>* ptr_current = ptr_head;
        while (ptr_current)
        {
            node_t<T>* ptr_to_remove = ptr_current;
            ptr_current = ptr_current->ptr_next;
            delete ptr_to_remove;
        }
    }
    
    // Выводит данные стека.
    void print() //const // С const той ошибки нет.
    {
        node_t<T>* ptr_current = ptr_head;
        while (ptr_current)
        {
            ptr_current->print();
            if (ptr_current->ptr_next)
                cout << ", ";
            ptr_current = ptr_current->ptr_next;
        }
    }
    
    // Выводит данные стека и переходит на новую строку.
    void println() const
    {
        print();
        cout << endl;
    }
};
 
int main(int argc, char** argv)
{
    stack_t<int>* s = new stack_t<int>(5, new int[5] { 1, 2, 3, 4, 5 });
    s->println();
    delete s;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.02.2019, 08:49
Ответы с готовыми решениями:

int const * const foo(const int* param) const - разъясните значение квалификаторов
int const * const foo(const int* param) const -----1------2----------3----------------4 1: ?...

Ошибка при компиляции error: cannot convert ‘int (*)[5]’ to ‘int**’ for argument ‘1’ to ‘void Replase(int**)'
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;iomanip&gt; #include &lt;cstdlib&gt; #define row 5...

error: invalid operands of types 'const int*' and 'const int*' to binary 'operator+'
Что означает ошибка в 8 строчке error: invalid operands of types 'const int*' and 'const int*' to...

Ошибка: Сannot convert const QVector<int> to int...
Доброго дня! Столкнулся вот с такой ошибкой int max; QList&lt;QVector&lt;int&gt; &gt;* Data_to_plot ;...

49
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
24.02.2019, 09:45 2
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Почему она пропадает, если поставить const после print у stack_t<T>?
потому что ты print вызываешь из const метода, void println() const, дальше говорить или уже понял?

Добавлено через 1 минуту
Соколиный глаз, ты в курсе что ты тут накосячил?
C++
1
2
3
4
~node_t()
{
    delete this;
}
1
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.02.2019, 09:53  [ТС] 3
_stanislav, из const методов можно вызывать только const методы?
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
24.02.2019, 09:59 4
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
из const методов можно вызывать только const методы?
да, это же естественно.
1
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.02.2019, 10:02  [ТС] 5
Цитата Сообщение от _stanislav Посмотреть сообщение
Соколиный глаз, ты в курсе что ты тут накосячил?
А чо не так?
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
24.02.2019, 10:05 6
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
А чо не так?
переполнение стека при удалении узла, ты код запускал? в деструкторе у тебя delete this приводет к вызову опять этого же деструктора.

Добавлено через 33 секунды
бесконечная рекурсия, мать ее
1
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.02.2019, 10:06  [ТС] 7
_stanislav, а исправить - как?
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
24.02.2019, 10:07 8
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
а исправить - как?
я же тебе скинул рабочий код https://www.cyberforum.ru/post13351507.html
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.02.2019, 10:10  [ТС] 9
_stanislav, меня очень смущает реализация самого деструктора:
C++
1
2
3
4
5
6
    ~node_t()
    {
        std::cout << "~node_t()" << value
            << std::endl;
        //delete ptr_next;
    }
Тут же ничего не происходит в плане удаления. А если не происходит - то какой смысл этого деструктора?
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
24.02.2019, 10:12 10
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Тут же ничего не происходит в плане удаления. А если не происходит - то какой смысл этого деструктора?
выкинь его

Добавлено через 1 минуту
я его для наглядности оставил, что бы видеть что все объекты удалены и память возвращена куче.
0
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.02.2019, 10:14  [ТС] 11
_stanislav, я что-то туплю. У меня всё таки цель память освободить занимаемую узлом стека. А если деструктор этого не делает, то получается же утечка памяти, разве я не прав?

Добавлено через 1 минуту
я его для наглядности оставил, что бы видеть что все объекты удалены и память возвращена куче.
Ты хочешь сказать, что память сама освобождается? Разве в C++ есть сборщик мусора? Я совсем запутался...
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
24.02.2019, 10:16 12
Соколиный глаз, у тебя же класс node_t вспомогательный, используется только внутри твоей обертки stack_t, интерфейс node_t ты знаешь, пусть он немного кудрявый. я бы вообще определение node_t в секцию private класса stack_t запихнул

Добавлено через 1 минуту
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
Ты хочешь сказать, что память сама освобождается? Разве в C++ есть сборщик мусора?
за освобождение памяти отвечает класс stack_t, побегай отладчиком не поленись
1
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.02.2019, 10:21  [ТС] 13
Цитата Сообщение от _stanislav Посмотреть сообщение
пусть он немного кудрявый
В чём? Есть рекомендации по улучшению?
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
24.02.2019, 10:24 14
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
я что-то туплю. У меня всё таки цель память освободить занимаемую узлом стека. А если деструктор этого не делает, то получается же утечка памяти, разве я не прав?
когда ты объявил поле ptr_next и инициализировал его указателем на следующий объект, деструктор уже его не должен трогать, угадай почему? я тебе уже писал вроде, при удалении одного узла будет вызываться деструктор который рекурсивно разрушит все твои объекты связанные через указатель ptr_next.

Добавлено через 39 секунд
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
В чём? Есть рекомендации по улучшению?
у меня нет.

Добавлено через 2 минуты
Цитата Сообщение от _stanislav Посмотреть сообщение
рекурсивно разрушит все твои объекты связанные через указатель ptr_next.
это про
C++
1
2
3
4
~node_t()
{
    delete ptr_next;
}
а вот такой деструктор к бесконечной рекурсии приведет
C++
1
2
3
4
~node_t()
{
    delete this;
}
1
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
24.02.2019, 11:15 15
Если экземплярами класса node_t владеет экземпляр stack_t, то в нем и должно выполняться освобождение памяти.
1
Alvin Seville
343 / 273 / 134
Регистрация: 25.07.2014
Сообщений: 4,537
Записей в блоге: 9
24.02.2019, 11:17  [ТС] 16
0x10, верно ли я понимаю, что при вызове деструктора выполняются написанные в нём инструкции, а затем освобождается память, занимаемая объектом?
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
24.02.2019, 11:40 17
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
верно ли я понимаю, что в при вызове деструктора выполняются написанные в нём инструкции, а затем освобождается память, занимаемая объектом?
Обычно так и происходит, но на всякий случай: сам деструктор не отвечает за освобождение памяти, и здесь не нужно смешивать два процесса: создания/разрушения объекта и выделения/освобождения памяти.

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
#include <iostream>
 
struct Value {
  Value() { std::cout << "ctor\n"; }
  ~Value() { std::cout << "dtor\n"; }
};
 
int main() {
  {
    std::cout << "automatic object\n";
    Value v;
    // При выходе из области видимости:
    // * автоматически вызывается деструктор
    // * память освободается
  }
 
  {
    std::cout << "dynamic object\n";
    Value* v = new Value();
    // При вызове delete:
    // * вызывается деструктор
    // * освобождается память
    delete v;
  }
 
  {
    std::cout << "placement new\n";
    // Выделение памяти
    char* buf = static_cast<char*>(operator new(sizeof(Value)));
    // Конструирование объекта
    new (buf) Value;
    // Вызов деструктора, память не освобождается
    reinterpret_cast<Value*>(buf)->~Value();
    // Освобождение памяти
    operator delete(buf);
  }
}
Цитата Сообщение от Соколиный глаз Посмотреть сообщение
int main(int argc, char** argv)
{
* * stack_t<int>* s = new stack_t<int>(5, new int[5] { 1, 2, 3, 4, 5 });
* * s->println();
* * delete s;
}
Здесь два вызова new и один delete. По-хорошему, не должно быть ни одного new и ни одного delete.
1
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
24.02.2019, 13:38 18
Цитата Сообщение от _stanislav Посмотреть сообщение
C++
1
2
3
4
~node_t()
{
    delete ptr_next;
}
}
можно оставить этот деструктор, удобно удалять весь стек, а в классе stack для удаления отдельного элемента списка достаточно предусмотреть разрушение связей
0
"C with Classes"
1645 / 1402 / 523
Регистрация: 16.08.2014
Сообщений: 5,877
Записей в блоге: 1
24.02.2019, 13:43 19
Цитата Сообщение от zayats80888 Посмотреть сообщение
можно оставить этот деструктор, удобно удалять весь стек, а в классе stack для удаления отдельного элемента списка достаточно предусмотреть разрушение связей
покажи
0
6091 / 3449 / 1402
Регистрация: 07.02.2019
Сообщений: 8,768
24.02.2019, 13:58 20
Цитата Сообщение от _stanislav Посмотреть сообщение
покажи
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    // Возвращает верхний элемент стека.
    T pop()
    {
        throw_if_empty();   
        T resultItem = ptr_head->value;
        node_t<T>* ptr_to_remove = ptr_head;
        ptr_head = ptr_head->next_ptr;
        ptr_to_remove->next_ptr=0; //вот так вот
        delete ptr_to_remove;
        count--;
        return resultItem;
    }
    //-------------------
 
 
    // Очищает стек.
        void clear()
    {
        delete ptr_head; //вот так вот
    }
Добавлено через 6 минут
тока я обычно проверяю на валидность
C++
1
if (p) delete p
1
24.02.2019, 13:58
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.02.2019, 13:58
Помогаю со студенческими работами здесь

ОШИБКА [Error] cannot convert 'int*' to 'float*' for argument '1' to 'void Syma(float*,int*,int)
Какая то проблема с указателями,незнаю,не хочет щитать суму парних чисел в второй...

Ошибка Cannot convert 'const char *' to 'void *'
Всем привет! Нужна помощь новичку. Пытаюсь в С++ Builder 2009 создать простую программу для...

int const и const int в чем разница этих записей
Попалась мне тут программа для выборочно сортировки, с ней все в принципе ясно, но я в ней встретил...

Чем отличаются выражения (const int[]){value} от (const int[]){100}
(const int){22} //Приведение к массиву и инициализация его значениями 22 от (const int){i} ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru