Вы работаете с неинициализированной памятью. Особенно вы пытаетесь реализовать собственное управление памятью, которое не удастся в 99% реализаций.
Вы можете просто использовать new
и delete
в своем созданном классе и больше не беспокоиться о памяти.
#include <string>
template <typename T>
struct Node {
T data;
Node *next;
};
template <typename T>
class Test
{
public:
Test() {
head = new Node<T>();
}
~Test() {
delete head; head = nullptr;
}
void setData(T data) {
if (head = nullptr) {
head->data = data;
}
}
private:
Node<T>* head = nullptr;
};
int main() {
Test<std::string> test_string;
Test<int> test_int;
test_string.setData("Hello");
test_int.setData(1);
return 0;
}
Важные примечания:
- в конструкторе
Test
, память будет выделяться - для каждого
new
, должно бытьdelete
. Поэтому обратите внимание на деструктор - для хорошей защитной реализации, всегда проверяйте, являются ли указатели
nullptr
- И для еще более лучшего стиля кода, ПОЖАЛУЙСТА, НЕ ИСПОЛЬЗУЙТЕ
using namespace std;
. Если вы сделаете это, вы open
получите огромное пространство имен, которое может столкнуться с некоторыми именами ваших классов или функций. Эту ошибку почти невозможно найти.
отказ от ответственности: это работает на MSVC2017.
BONUS
Для более современных c++
,Вы можете использовать std::unique_ptr
.
#include <string>
#include <memory>
template <typename T>
struct Node {
T data;
Node *next;
};
template <typename T>
class Test
{
public:
void setData(T data)
{
if (head = nullptr)
{
head->data = data;
}
}
private:
std::unique_ptr<Node<T>> head = std::make_unique<Node<T>>();
};
int main()
{
Test<std::string> test_string;
Test<int> test_int;
test_string.setData("Hello");
test_int.setData(1);
return 0;
}